id = $id; $this->name = $name; $this->price = floatval($price); $this->options = new CartItemOptions($options); $this->rowId = $this->generateRowId($id, $options); } /** * Returns the formatted price without TAX. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function price($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->price, $decimals, $decimalPoint, $thousandSeperator); } /** * Returns the formatted price with TAX. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function priceTax($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->priceTax, $decimals, $decimalPoint, $thousandSeperator); } /** * Returns the formatted subtotal. * Subtotal is price for whole CartItem without TAX * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->subtotal, $decimals, $decimalPoint, $thousandSeperator); } /** * Returns the formatted total. * Total is price for whole CartItem with TAX * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->total, $decimals, $decimalPoint, $thousandSeperator); } /** * Returns the formatted tax. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->tax, $decimals, $decimalPoint, $thousandSeperator); } /** * Returns the formatted tax. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function taxTotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->taxTotal, $decimals, $decimalPoint, $thousandSeperator); } /** * Set the quantity for this cart item. * * @param int|float $qty */ public function setQuantity($qty) { if(empty($qty) || ! is_numeric($qty)) throw new \InvalidArgumentException('Please supply a valid quantity.'); $this->qty = $qty; } /** * Update the cart item from a Buyable. * * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item * @return void */ public function updateFromBuyable(Buyable $item) { $this->id = $item->getBuyableIdentifier($this->options); $this->name = $item->getBuyableDescription($this->options); $this->price = $item->getBuyablePrice($this->options); $this->priceTax = $this->price + $this->tax; } /** * Update the cart item from an array. * * @param array $attributes * @return void */ public function updateFromArray(array $attributes) { $this->id = array_get($attributes, 'id', $this->id); $this->qty = array_get($attributes, 'qty', $this->qty); $this->name = array_get($attributes, 'name', $this->name); $this->price = array_get($attributes, 'price', $this->price); $this->priceTax = $this->price + $this->tax; $this->options = new CartItemOptions(array_get($attributes, 'options', $this->options)); $this->rowId = $this->generateRowId($this->id, $this->options->all()); } /** * Associate the cart item with the given model. * * @param mixed $model * @return void */ public function associate($model) { $this->associatedModel = is_string($model) ? $model : get_class($model); } /** * Set the tax rate. * * @param int|float $taxRate * @return void */ public function setTaxRate($taxRate) { $this->taxRate = $taxRate; } /** * Get an attribute from the cart item or get the associated model. * * @param string $attribute * @return mixed */ public function __get($attribute) { if(property_exists($this, $attribute)) { return $this->{$attribute}; } if($attribute === 'priceTax') { return $this->price + $this->tax; } if($attribute === 'subtotal') { return $this->qty * $this->price; } if($attribute === 'total') { return $this->qty * ($this->priceTax); } if($attribute === 'tax') { return $this->price * ($this->taxRate / 100); } if($attribute === 'taxTotal') { return $this->tax * $this->qty; } if($attribute === 'model') { return with(new $this->associatedModel)->find($this->id); } return null; } /** * Create a new instance from a Buyable. * * @param \Gloudemans\Shoppingcart\Contracts\Buyable $item * @param array $options * @return \Gloudemans\Shoppingcart\CartItem */ public static function fromBuyable(Buyable $item, array $options = []) { return new self($item->getBuyableIdentifier($options), $item->getBuyableDescription($options), $item->getBuyablePrice($options), $options); } /** * Create a new instance from the given array. * * @param array $attributes * @return \Gloudemans\Shoppingcart\CartItem */ public static function fromArray(array $attributes) { $options = array_get($attributes, 'options', []); return new self($attributes['id'], $attributes['name'], $attributes['price'], $options); } /** * Create a new instance from the given attributes. * * @param int|string $id * @param string $name * @param float $price * @param array $options * @return \Gloudemans\Shoppingcart\CartItem */ public static function fromAttributes($id, $name, $price, array $options = []) { return new self($id, $name, $price, $options); } /** * Generate a unique id for the cart item. * * @param string $id * @param array $options * @return string */ protected function generateRowId($id, array $options) { ksort($options); return md5($id . serialize($options)); } /** * Get the instance as an array. * * @return array */ public function toArray() { return [ 'rowId' => $this->rowId, 'id' => $this->id, 'name' => $this->name, 'qty' => $this->qty, 'price' => $this->price, 'options' => $this->options, 'tax' => $this->tax, 'subtotal' => $this->subtotal ]; } /** * Get the Formated number * * @param $value * @param $decimals * @param $decimalPoint * @param $thousandSeperator * @return string */ private function numberFormat($value, $decimals, $decimalPoint, $thousandSeperator) { if(is_null($decimals)){ $decimals = is_null(config('cart.format.decimals')) ? 2 : config('cart.format.decimals'); } if(is_null($decimalPoint)){ $decimalPoint = is_null(config('cart.format.decimal_point')) ? '.' : config('cart.format.decimal_point'); } if(is_null($thousandSeperator)){ $thousandSeperator = is_null(config('cart.format.thousand_seperator')) ? ',' : config('cart.format.thousand_seperator'); } return number_format($value, $decimals, $decimalPoint, $thousandSeperator); } }