diff --git a/packages/Webkul/Discount/src/Actions/Cart/Action.php b/packages/Webkul/Discount/src/Actions/Cart/Action.php index 2bcacf39d..cabe673a4 100644 --- a/packages/Webkul/Discount/src/Actions/Cart/Action.php +++ b/packages/Webkul/Discount/src/Actions/Cart/Action.php @@ -9,23 +9,13 @@ abstract class Action */ protected $rule; - /** - * Empty collection instance for keeping final list of items - */ - protected $matchedItems; - - public function __construct() - { - $this->matchedItems = collect(); - } - abstract public function calculate($rule); /** * To find the eligble items for the current rule, * * @param CartRule $rule - * @return Collection $matchedItems + * @return Collection $eligibleItems */ public function getEligibleItems() { @@ -35,13 +25,13 @@ abstract class Action $items = $cart->items()->get(); + $eligibleItems = collect(); + if ($this->rule->action_type == 'whole_cart_to_percent' || $this->rule->action_type == 'whole_cart_to_fixed_amount') - $this->matchedItems = $items; + $this->eligibleItems = $items; if (! $rule->uses_attribute_conditions) { - $this->matchedItems = $items; - - return $this->matchedItems; + return $items; } else { $productIDs = explode(',', $rule->product_ids); @@ -51,15 +41,15 @@ abstract class Action foreach ($childrens as $children) { if ($children->product_id == $productID) - $this->matchedItems->push($children); + $eligibleItems->push($item); } if ($item->product_id == $productID) - $this->matchedItems->push($item); + $eligibleItems->push($item); } } - return $this->matchedItems; + return $eligibleItems; } } diff --git a/packages/Webkul/Discount/src/Actions/Cart/FixedAmount.php b/packages/Webkul/Discount/src/Actions/Cart/FixedAmount.php index db3907920..12f86396c 100644 --- a/packages/Webkul/Discount/src/Actions/Cart/FixedAmount.php +++ b/packages/Webkul/Discount/src/Actions/Cart/FixedAmount.php @@ -8,8 +8,6 @@ class FixedAmount extends Action { public function __construct($rule) { - parent::__construct(); - $this->rule = $rule; } @@ -24,9 +22,12 @@ class FixedAmount extends Action foreach ($eligibleItems as $item) { $report = array(); + $report['item_id'] = $item->id; $report['child_items'] = collect(); + $perItemDiscount = $rule->disc_amount / $eligibleItems->count(); + $itemPrice = $item->base_price; $itemQuantity = $item->quantity; @@ -54,7 +55,7 @@ class FixedAmount extends Action $itemDiscount = $childBaseTotal / ($item->base_total / 100); - $children->discount = ($itemDiscount / 100) * $rule->disc_amount; + $children->discount = ($itemDiscount / 100) * $perItemDiscount; $children->discount = $children->base_total > $children->discount ? $children->discount : $children->base_total; @@ -65,7 +66,7 @@ class FixedAmount extends Action $report['product_id'] = $item->product_id; } - $discount = round($rule->disc_amount, 4) * $discQuantity; + $discount = round($perItemDiscount, 4) * $discQuantity; $discount = $discount <= $itemPrice * $discQuantity ? $discount : $itemPrice * $discQuantity; $report['discount'] = $discount; diff --git a/packages/Webkul/Discount/src/Actions/Cart/PercentOfProduct.php b/packages/Webkul/Discount/src/Actions/Cart/PercentOfProduct.php index a21db2d8f..9079bb675 100644 --- a/packages/Webkul/Discount/src/Actions/Cart/PercentOfProduct.php +++ b/packages/Webkul/Discount/src/Actions/Cart/PercentOfProduct.php @@ -8,8 +8,6 @@ class PercentOfProduct extends Action { public function __construct($rule) { - parent::__construct(); - /** * Setting the rule getting applied */ @@ -34,23 +32,23 @@ class PercentOfProduct extends Action if ($applicability) { $eligibleItems = $this->getEligibleItems(); + $applicableDiscount = \Cart::getCart()->base_sub_total * ($rule->disc_amount / 100); + foreach ($eligibleItems as $item) { $report = array(); $report['item_id'] = $item->id; $report['child_items'] = collect(); + $perItemDiscount = $applicableDiscount / $eligibleItems->count(); + $itemPrice = $item->base_price; + $itemQuantity = $item->quantity; - $discQuantity = $this->rule->disc_quantity; + $discQuantity = $rule->disc_quantity; $discQuantity = $itemQuantity <= $discQuantity ? $itemQuantity : $discQuantity; - $discountAmount = ($this->rule->disc_amount > 100) ? 100 : $this->rule->disc_amount; - - $discount = $itemPrice * ($discountAmount / 100) * $discQuantity; - $discount = $discount <= $itemPrice * $discQuantity ? $discount : $itemPrice * $discQuantity; - if ($item->product->getTypeInstance()->isComposite()) { $isQtyZero = true; @@ -71,7 +69,7 @@ class PercentOfProduct extends Action $itemDiscount = $childBaseTotal / ($item->base_total / 100); - $children->discount = ($itemDiscount / 100) * ($item->base_total * ($this->rule->disc_amount / 100)); + $children->discount = ($itemDiscount / 100) * $perItemDiscount; $children->discount = $children->base_total > $children->discount ? $children->discount : $children->base_total; @@ -82,8 +80,10 @@ class PercentOfProduct extends Action $report['product_id'] = $item->product_id; } - $report['discount'] = $discount; + $discount = round($perItemDiscount, 4) * $discQuantity; + $discount = $discount <= $itemPrice * $discQuantity ? $discount : $itemPrice * $discQuantity; + $report['discount'] = $discount; $report['formatted_discount'] = core()->currency($discount); $impact->push($report);