Passed
Pull Request — master (#4)
by Carsten
09:22
created

Item::setIdentifier()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
/**
4
 * This file is part of Lenius Basket, a PHP package to handle
5
 * your shopping basket.
6
 *
7
 * Copyright (c) 2017 Lenius.
8
 * https://github.com/lenius/basket
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 *
13
 * @author Carsten Jonstrup<[email protected]>
14
 * @copyright 2017 Lenius.
15
 *
16
 * @version production
17
 *
18
 * @link https://github.com/lenius/basket
19
 */
20
21
namespace Lenius\Basket;
22
23
/**
24
 * Class Item.
25
 *
26
 * @property-read string $identifier
27
 * @property-read float $price
28
 * @property-read int $quantity
29
 * @property-read float $weight
30
 */
31
class Item implements ItemInterface
32
{
33
    /** @var string $identifier */
34
    protected $identifier;
35
36
    /** @var Tax $tax */
37
    protected $tax;
38
39
    /** @var array $data */
40
    protected $data = [];
41
42
    /**
43
     * Construct the item.
44
     *
45
     * @param array $item
46
     */
47 25
    public function __construct(array $item)
48
    {
49 25
        foreach ($item as $key => $value) {
50 25
            $this->data[$key] = $value;
51
        }
52
53 25
        $item['tax'] = isset($item['tax']) ? $item['tax'] : 0;
54
55 25
        $this->tax = new Tax($item['tax']);
56 25
    }
57
58
    /**
59
     * Set identifier.
60
     *
61
     * @param mixed $identifier
62
     *
63
     * @return mixed|void
64
     */
65 18
    public function setIdentifier($identifier)
66
    {
67 18
        $this->identifier = $identifier;
68 18
    }
69
70
    /**
71
     * Return the value of protected methods.
72
     *
73
     * @param mixed $param
74
     *
75
     * @return mixed
76
     */
77 23
    public function __get($param)
78
    {
79 23
        return $param == 'identifier' ? $this->identifier : $this->data[$param];
80
    }
81
82
    /**
83
     * Update data array using set magic method.
84
     *
85
     * @param string $param The key to set
86
     * @param mixed  $value The value to set $param to
87
     */
88 19
    public function __set($param, $value)
89
    {
90 19
        $this->data[$param] = $value;
91
92 19
        if ($param == 'tax') {
93 1
            $this->tax = new Tax($value);
94
        }
95 19
    }
96
97
    /**
98
     * Return the total tax for this item.
99
     *
100
     * @return float
101
     */
102 3
    public function tax()
103
    {
104 3
        $price = $this->totalPrice();
105 3
        $quantity = $this->quantity;
106
107 3
        return $this->tax->rate($price * $quantity);
108
    }
109
110
    /**
111
     * Return the total price for this item.
112
     *
113
     * @return float
114
     */
115 11 View Code Duplication
    private function totalPrice()
116
    {
117 11
        $price = $this->price;
118
119 11
        if ($this->hasOptions()) {
120 3
            foreach ($this->data['options'] as $item) {
121 3
                if (array_key_exists('price', $item)) {
122 3
                    $price += $item['price'];
123
                }
124
            }
125
        }
126
127 11
        return $price;
128
    }
129
130
    /**
131
     * Return the total of the item, with or without tax.
132
     *
133
     * @param bool $includeTax Whether or not to include tax
134
     *
135
     * @return float The total, as a float
136
     */
137 7 View Code Duplication
    public function total($includeTax = true)
138
    {
139 7
        $price = $this->totalPrice();
140
141 7
        if ($includeTax) {
142 7
            $price = $this->tax->add($price);
143
        }
144
145 7
        return $price * $this->quantity;
146
    }
147
148
    /**
149
     * Return the total weight of the item.
150
     *
151
     * @return float The weight, as a float
152
     */
153 4 View Code Duplication
    public function weight()
154
    {
155 4
        $weight = $this->weight;
156
157 4
        if ($this->hasOptions()) {
158 3
            foreach ($this->data['options'] as $item) {
159 3
                if (array_key_exists('weight', $item)) {
160 3
                    $weight += $item['weight'];
161
                }
162
            }
163
        }
164
165 4
        return $weight * $this->quantity;
166
    }
167
168
    /**
169
     * Return the total of the item, with or without tax.
170
     *
171
     * @param bool $includeTax Whether or not to include tax
172
     *
173
     * @return float The total, as a float
174
     */
175 1 View Code Duplication
    public function single($includeTax = true)
176
    {
177 1
        $price = $this->totalPrice();
178
179 1
        if ($includeTax) {
180 1
            $price = $this->tax->add($price);
181
        }
182
183 1
        return $price;
184
    }
185
186
    /**
187
     * Update a single key for this item, or multiple.
188
     *
189
     * @param mixed $key   The array key to update, or an array of key-value pairs to update
190
     * @param mixed $value
191
     *
192
     * @return void
193
     */
194 4
    public function update($key, $value = null)
195
    {
196 4
        if ($key instanceof ItemInterface) {
197 1
            foreach ($key->toArray() as $updateKey => $updateValue) {
198 1
                $this->update($updateKey, $updateValue);
199
            }
200
        } else {
201 4
            if ($key == 'tax' && is_numeric($value)) {
202 2
                $this->tax = new Tax(floatval($value));
203
            } else {
204
                // update the item
205 2
                $this->data[$key] = $value;
206
            }
207
        }
208 4
    }
209
210
    /**
211
     * Check if this item has options.
212
     *
213
     * @return bool Yes or no?
214
     */
215 17
    public function hasOptions()
216
    {
217 17
        return array_key_exists('options', $this->data) && !empty($this->data['options']);
218
    }
219
220
    /**
221
     * Convert the item into an array.
222
     *
223
     * @return array The item data
224
     */
225 18
    public function toArray()
226
    {
227 18
        return $this->data;
228
    }
229
}
230