Completed
Pull Request — master (#3)
by
unknown
03:19
created

Bill::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 10
dl 0
loc 22
ccs 11
cts 11
cp 1
crap 1
rs 9.9332
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 * PHP Billing Library
4
 *
5
 * @link      https://github.com/hiqdev/php-billing
6
 * @package   php-billing
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2017-2018, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hiqdev\php\billing\bill;
12
13
use DateTimeImmutable;
14
use hiqdev\php\billing\charge\ChargeInterface;
15
use hiqdev\php\billing\customer\CustomerInterface;
16
use hiqdev\php\billing\plan\PlanInterface;
17
use hiqdev\php\billing\target\TargetInterface;
18
use hiqdev\php\billing\type\TypeInterface;
19
use hiqdev\php\units\QuantityInterface;
20
use Money\Money;
21
22
/**
23
 * Bill.
24
 *
25
 * @author Andrii Vasyliev <[email protected]>
26
 */
27
class Bill implements BillInterface
28
{
29
    /** @var int|string */
30
    protected $id;
31
32
    /** @var TypeInterface */
33
    protected $type;
34
35
    /** @var DateTimeImmutable */
36
    protected $time;
37
38
    /** @var Money */
39
    protected $sum;
40
41
    /** @var QuantityInterface */
42
    protected $quantity;
43
44
    /** @var CustomerInterface */
45
    protected $customer;
46
47
    /** @var TargetInterface */
48
    protected $target;
49
50
    /** @var PlanInterface */
51
    protected $plan;
52
53
    /** @var ChargeInterface[] */
54
    protected $charges = [];
55
56
    /** @var BillState */
57
    protected $state;
58
59
    /** @var string */
60
    protected $comment;
61
62 1
    public function __construct(
63
                            $id,
64
        TypeInterface       $type,
65
        DateTimeImmutable   $time,
66
        Money               $sum,
67
        QuantityInterface   $quantity,
68
        CustomerInterface   $customer,
69
        TargetInterface     $target = null,
70
        PlanInterface       $plan = null,
71
        array               $charges = [],
72
        BillState           $state = null
73
    ) {
74 1
        $this->id           = $id;
75 1
        $this->type         = $type;
76 1
        $this->time         = $time;
77 1
        $this->sum          = $sum;
78 1
        $this->quantity     = $quantity;
79 1
        $this->customer     = $customer;
80 1
        $this->target       = $target;
81 1
        $this->plan         = $plan;
82 1
        $this->charges      = $charges;
83 1
        $this->state        = $state;
84 1
    }
85
86 1
    public function getUniqueString(): string
87
    {
88
        $parts = [
89 1
            'buyer'     => $this->customer->getUniqueId(),
90 1
            'currency'  => $this->sum->getCurrency()->getCode(),
91 1
            'target'    => $this->target ? $this->target->getUniqueId() : null,
92 1
            'type'      => $this->type->getUniqueId(),
93 1
            'time'      => $this->time->format('c'),
94 1
            'plan'      => $this->plan ? $this->plan->getUniqueId() : null,
95
        ];
96
97 1
        return implode('-', $parts);
98
    }
99
100
    public function calculatePrice()
101
    {
102
        $quantity = $this->quantity->getQuantity();
103
104
        return $quantity ? $this->sum->divide($quantity) : $this->sum;
105
    }
106
107
    /**
108
     * @return int|string
109
     */
110
    public function getId()
111
    {
112
        return $this->id;
113
    }
114
115
    public function setId($id)
116
    {
117
        if ($this->id === $id) {
118
            return;
119
        }
120
        if ($this->id !== null) {
121
            throw new \Exception('cannot reassign bill id');
122
        }
123
        $this->id = $id;
124
    }
125
126
    /**
127
     * @return TypeInterface
128
     */
129 1
    public function getType(): TypeInterface
130
    {
131 1
        return $this->type;
132
    }
133
134
    /**
135
     * @return DateTimeImmutable
136
     */
137 1
    public function getTime(): DateTimeImmutable
138
    {
139 1
        return $this->time;
140
    }
141
142
    /**
143
     * @return TargetInterface
144
     */
145 1
    public function getTarget()
146
    {
147 1
        return $this->target;
148
    }
149
150
    /**
151
     * @return CustomerInterface
152
     */
153 1
    public function getCustomer()
154
    {
155 1
        return $this->customer;
156
    }
157
158
    /**
159
     * @return QuantityInterface
160
     */
161 1
    public function getQuantity()
162
    {
163 1
        return $this->quantity;
164
    }
165
166
    /**
167
     * @return Money
168
     */
169 1
    public function getSum()
170
    {
171 1
        return $this->sum;
172
    }
173
174
    /**
175
     * @return PlanInterface
176
     */
177 1
    public function getPlan()
178
    {
179 1
        return $this->plan;
180
    }
181
182
    /**
183
     * @return ChargeInterface[]
184
     */
185 1
    public function getCharges()
186
    {
187 1
        return $this->charges;
188
    }
189
190
    /**
191
     * @return string - comma separated charges ids
192
     */
193
    public function getChargesIds()
194
    {
195
        $ids = [];
196
197
        foreach ($this->charges as $charge) {
198
            $ids[] = $charge->getId();
199
        }
200
        $chargeIds = implode(',', $ids);
201
202
        return $chargeIds;
203
    }
204
205
    public function getState(): ?BillState
206
    {
207
        return $this->state;
208
    }
209
210
    public function setFinished(): void
211
    {
212
        $this->state = BillState::finished();
213
    }
214
215
    public function isFinished(): ?bool
216
    {
217
        return $this->state === null ? null : $this->state->isFinished();
218
    }
219
220
    public function getComment()
221
    {
222
        return $this->comment;
223
    }
224
225
    public function setComment(string $comment)
226
    {
227
        $this->comment = $comment;
228
    }
229
230
    public function jsonSerialize()
231
    {
232
        return get_object_vars($this);
233
    }
234
}
235