From 9fe43d2bec584ba6528efdb978ec36f69353e53b Mon Sep 17 00:00:00 2001 From: Patrick Date: Tue, 8 Feb 2022 23:39:31 +0100 Subject: [PATCH] Update CartItemModel.php --- src/Models/CartItemModel.php | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/Models/CartItemModel.php b/src/Models/CartItemModel.php index a365ea9..2eabedc 100644 --- a/src/Models/CartItemModel.php +++ b/src/Models/CartItemModel.php @@ -23,6 +23,7 @@ class CartItemModel extends Model 'row_id', 'cart_id', 'price', + 'qty', 'discount_rate', 'discount_fixed', 'taxRate', @@ -56,4 +57,74 @@ class CartItemModel extends Model set: fn (Money $value) => $value, ); } + + /** + * This will is the price of the CartItem considering the set quantity. If you need the single + * price just set the parameter to true. + */ + public function priceAll(): Attribute + { + return new Attribute( + get: fn () => $this->price->multiply($this->qty), + ); + } + + /** + * This is the discount granted for this CartItem. It is based on the given price and, in case + * discount is a float, multiplied or, in case it is an absolute Money, subtracted. It will return + * a minimum value of 0. + */ + public function discount(): Attribute + { + return new Attribute( + get: fn () => { + if ($this->discount instanceof Money) { + return $this->price_all->subtract($this->discount) + } else { + return $this->price_all->multiply(sprintf('%.14F', $this->discount), Config::get('cart.rounding', Money::ROUND_UP)), + } + }, + ); + } + + /** + * This is the final price of the CartItem but without any tax applied. This does on the + * other hand include any discounts. + */ + public function subtotal(): Attribute + { + return new Attribute( + get: fn () => Money::max(new Money(0, $this->price->getCurrency()), $this->price()->subtract($this->discount())), + ); + } + + /** + * This is the tax, based on the subtotal (all previous calculations) and set tax rate. + */ + public function tax(): Attribute + { + return new Attribute( + get: fn () => $this->subtotal()->multiply(sprintf('%.14F', $this->taxRate), Config::get('cart.rounding', Money::ROUND_UP)), + ); + } + + /** + * This is the total price, consisting of the subtotal and tax applied. + */ + public function total(): Attribute + { + return new Attribute( + get: fn () => $this->subtotal()->add($this->tax()), + ); + } + + /** + * This is the total price, consisting of the subtotal and tax applied. + */ + public function totalWeight(): Attribute + { + return new Attribute( + get: fn () => $this->qty * $this->weight, + ); + } }