CartItem::setCheckTypeInteger()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
c 0
b 0
f 0
ccs 4
cts 4
cp 1
rs 9.4285
cc 2
eloc 3
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Cart;
4
5
/**
6
 * @property string $id
7
 * @property int    $quantity
8
 * @property float  $price
9
 * @property float  $tax
10
 */
11
class CartItem implements \ArrayAccess, Arrayable
12
{
13
    /**
14
     * Cart item data.
15
     *
16
     * @var array
17
     */
18
    private $data;
19
20
    /**
21
     * Create a new cart item instance.
22
     *
23
     * @param array $data
24
     */
25 29
    public function __construct(array $data = [])
26
    {
27
        $defaults = [
28 29
            'quantity' => 1,
29
            'price' => 0.00,
30
            'tax' => 0.00,
31
        ];
32
33 29
        $data = array_merge($defaults, $data);
34
35 29
        foreach ($data as $k => $v) {
36 29
            $this->$k = $v;
37
        }
38 29
    }
39
40
    /**
41
     * Get the cart item id.
42
     *
43
     * @return string
44
     */
45 29
    public function getId()
46
    {
47
        // keys to ignore in the hashing process
48 29
        $ignoreKeys = ['quantity'];
49
50
        // data to use for the hashing process
51 29
        $hashData = $this->data;
52 29
        foreach ($ignoreKeys as $key) {
53 29
            unset($hashData[$key]);
54
        }
55
56 29
        $hash = sha1(serialize($hashData));
57
58 29
        return $hash;
59
    }
60
61
    /**
62
     * Get a piece of data set on the cart item.
63
     *
64
     * @param string $key
65
     *
66
     * @return mixed
67
     */
68 25
    public function get($key)
69
    {
70
        switch ($key) {
71 25
            case 'id':
72 15
                return $this->getId();
73
            default:
74 16
                return $this->data[$key];
75
        }
76
    }
77
78
    /**
79
     * Set a piece of data on the cart item.
80
     *
81
     * @param string $key
82
     * @param mixed  $value
83
     *
84
     * @return string
85
     */
86 29
    public function set($key, $value)
87
    {
88
        switch ($key) {
89 29
            case 'quantity':
90 29
                $this->setCheckTypeInteger($value, $key);
91 29
            break;
92 29
            case 'price':
93 29
            case 'tax':
94 29
                $this->setCheckIsNumeric($value, $key);
95
96 29
                $value = (float) $value;
97
        }
98
99 29
        $this->data[$key] = $value;
100
101 29
        return $this->getId();
102
    }
103
104
    /**
105
     * Check the value being set is an integer.
106
     *
107
     * @param mixed  $value
108
     * @param string $name
109
     *
110
     * @throws \InvalidArgumentException
111
     */
112 29
    private function setCheckTypeInteger($value, $name)
113
    {
114 29
        if (!is_integer($value)) {
115 1
            throw new \InvalidArgumentException(sprintf('%s must be an integer.', $name));
116
        }
117 29
    }
118
119
    /**
120
     * Check the value being set is an integer.
121
     *
122
     * @param mixed  $value
123
     * @param string $name
124
     *
125
     * @throws \InvalidArgumentException
126
     */
127 29
    private function setCheckIsNumeric($value, $name)
128
    {
129 29
        if (!is_numeric($value)) {
130 1
            throw new \InvalidArgumentException(sprintf('%s must be numeric.', $name));
131
        }
132 29
    }
133
134
    /**
135
     * Get the total price of the cart item including tax.
136
     *
137
     * @return float
138
     */
139 2
    public function getTotalPrice()
140
    {
141 2
        return (float) ($this->price + $this->tax) * $this->quantity;
142
    }
143
144
    /**
145
     * Get the total price of the cart item excluding tax.
146
     *
147
     * @return float
148
     */
149 2
    public function getTotalPriceExcludingTax()
150
    {
151 2
        return (float) $this->price * $this->quantity;
152
    }
153
154
    /**
155
     * Get the single price of the cart item including tax.
156
     *
157
     * @return float
158
     */
159 1
    public function getSinglePrice()
160
    {
161 1
        return (float) $this->price + $this->tax;
162
    }
163
164
    /**
165
     * Get the single price of the cart item excluding tax.
166
     *
167
     * @return float
168
     */
169 1
    public function getSinglePriceExcludingTax()
170
    {
171 1
        return (float) $this->price;
172
    }
173
174
    /**
175
     * Get the total tax for the cart item.
176
     *
177
     * @return float
178
     */
179 2
    public function getTotalTax()
180
    {
181 2
        return (float) $this->tax * $this->quantity;
182
    }
183
184
    /**
185
     * Get the single tax value of the cart item.
186
     *
187
     * @return float
188
     */
189 1
    public function getSingleTax()
190
    {
191 1
        return (float) $this->tax;
192
    }
193
194
    /**
195
     * Export the cart item as an array.
196
     *
197
     * @return array
198
     */
199 2
    public function toArray()
200
    {
201
        return [
202 2
            'id' => $this->getId(),
203 2
            'data' => $this->data,
204
        ];
205
    }
206
207
    /**
208
     * Determine if a piece of data is set on the cart item.
209
     *
210
     * @param string $key
211
     *
212
     * @return bool
213
     */
214 1
    public function offsetExists($key)
215
    {
216 1
        return array_key_exists($key, $this->data);
217
    }
218
219
    /**
220
     * Get a piece of data set on the cart item.
221
     *
222
     * @param string $key
223
     *
224
     * @return mixed
225
     */
226 1
    public function offsetGet($key)
227
    {
228 1
        return $this->get($key);
229
    }
230
231
    /**
232
     * Set a piece of data on the cart item.
233
     *
234
     * @param string $key
235
     * @param mixed  $value
236
     */
237 1
    public function offsetSet($key, $value)
238
    {
239 1
        $this->set($key, $value);
240 1
    }
241
242
    /**
243
     * Unset a piece of data from the cart item.
244
     *
245
     * @param string $key
246
     */
247 1
    public function offsetUnset($key)
248
    {
249 1
        unset($this->data[$key]);
250 1
    }
251
252
    /**
253
     * Get a piece of data set on the cart item.
254
     *
255
     * @param string $key
256
     *
257
     * @return mixed
258
     */
259 25
    public function __get($key)
260
    {
261 25
        return $this->get($key);
262
    }
263
264
    /**
265
     * Set a piece of data on the cart item.
266
     *
267
     * @param string $key
268
     * @param mixed  $value
269
     */
270 29
    public function __set($key, $value)
271
    {
272 29
        $this->set($key, $value);
273 29
    }
274
275
    /**
276
     * Determine if a piece of data is set on the cart item.
277
     *
278
     * @param string $key
279
     *
280
     * @return bool
281
     */
282 1
    public function __isset($key)
283
    {
284 1
        return isset($this->data[$key]);
285
    }
286
287
    /**
288
     * Unset a piece of data from the cart item.
289
     *
290
     * @param string $key
291
     */
292 1
    public function __unset($key)
293
    {
294 1
        unset($this->data[$key]);
295 1
    }
296
}
297