Skip to content

Commit

Permalink
Merge pull request #164 from bold-commerce/Q1-601-v3
Browse files Browse the repository at this point in the history
Q1-601-v3: Incorrectly calculating discount for the rule type "Fixed amount for whole cart".
  • Loading branch information
nmalevanec authored Oct 25, 2023
2 parents bdc259f + 6e6edd7 commit 39f2859
Show file tree
Hide file tree
Showing 8 changed files with 297 additions and 1 deletion.
40 changes: 40 additions & 0 deletions Api/Data/DiscountDataInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Api\Data;

/**
* Discount Data Interface
* @api
*/
interface DiscountDataInterface
{
/**
* Get Amount
*
* @return float
*/
public function getAmount();

/**
* Get Base Amount
*
* @return float
*/
public function getBaseAmount();

/**
* Get Original Amount
*
* @return float
*/
public function getOriginalAmount();

/**
* Get Base Original Amount
*
* @return float
*/
public function getBaseOriginalAmount();
}
33 changes: 33 additions & 0 deletions Api/Data/RuleDiscountInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Api\Data;

/**
* Rule discount Interface
* @api
*/
interface RuleDiscountInterface
{
/**
* Get Discount Data
*
* @return \Bold\Checkout\Api\Data\DiscountDataInterface
*/
public function getDiscountData();

/**
* Get Rule Label
*
* @return string
*/
public function getRuleLabel();

/**
* Get Rule ID
*
* @return int
*/
public function getRuleID();
}
74 changes: 74 additions & 0 deletions Model/Data/DiscountData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Model\Data;

use Bold\Checkout\Api\Data\DiscountDataInterface;
use Magento\Framework\Api\ExtensionAttributesInterface;
use Magento\Framework\Model\AbstractExtensibleModel;

/**
* Discount Data Model
*/
class DiscountData extends AbstractExtensibleModel implements DiscountDataInterface
{
const AMOUNT = 'amount';
const BASE_AMOUNT = 'base_amount';
const ORIGINAL_AMOUNT = 'original_amount';
const BASE_ORIGINAL_AMOUNT = 'base_original_amount';

/**
* @inheritDoc
*/
public function getAmount()
{
return $this->getData(self::AMOUNT);
}

/**
* @inheritDoc
*/
public function getBaseAmount()
{
return $this->getData(self::BASE_AMOUNT);
}

/**
* @inheritDoc
*/
public function getOriginalAmount()
{
return $this->getData(self::ORIGINAL_AMOUNT);
}

/**
* @inheritDoc
*/
public function getBaseOriginalAmount()
{
return $this->getData(self::BASE_ORIGINAL_AMOUNT);
}

/**
* Retrieve existing extension attributes object or create a new one.
*
* @return ExtensionAttributesInterface|null
*/
public function getExtensionAttributes()
{
return $this->_getExtensionAttributes();
}

/**
* Set an extension attributes object.
*
* @param ExtensionAttributesInterface $extensionAttributes
* @return $this
*/
public function setExtensionAttributes(
ExtensionAttributesInterface $extensionAttributes
) {
return $this->_setExtensionAttributes($extensionAttributes);
}
}
65 changes: 65 additions & 0 deletions Model/Data/RuleDiscount.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Model\Data;

use Magento\Framework\Api\ExtensionAttributesInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
use Bold\Checkout\Api\Data\RuleDiscountInterface;

/**
* Data Model for Rule Discount
*/
class RuleDiscount extends AbstractExtensibleModel implements RuleDiscountInterface
{
const KEY_DISCOUNT_DATA = 'discount';
const KEY_RULE_LABEL = 'rule';
const KEY_RULE_ID = 'rule_id';

/**
* @inheritDoc
*/
public function getDiscountData()
{
return $this->getData(self::KEY_DISCOUNT_DATA);
}

/**
* @inheritDoc
*/
public function getRuleLabel()
{
return $this->getData(self::KEY_RULE_LABEL);
}

/**
* @inheritDoc
*/
public function getRuleID()
{
return $this->getData(self::KEY_RULE_ID);
}

/**
* Retrieve existing extension attributes object or create a new one.
*
* @return ExtensionAttributesInterface|null
*/
public function getExtensionAttributes()
{
return $this->_getExtensionAttributes();
}

/**
* Set an extension attributes object.
*
* @param ExtensionAttributesInterface $extensionAttributes
* @return $this
*/
public function setExtensionAttributes(
ExtensionAttributesInterface $extensionAttributes
) {
return $this->_setExtensionAttributes($extensionAttributes);
}
}
16 changes: 15 additions & 1 deletion Model/Quote/Result/Builder.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Model\Quote\Result;
Expand All @@ -7,6 +8,7 @@
use Bold\Checkout\Api\Data\Quote\ResultInterface;
use Bold\Checkout\Api\Data\Quote\ResultInterfaceFactory;
use Bold\Checkout\Model\Quote\Item\Validator;
use Bold\Checkout\Model\Quote\Result\Builder\AddBoldDiscountsExtensionAttribute;
use Bold\Checkout\Model\Quote\Result\Builder\ExtractCartTotals;
use Bold\Checkout\Model\Quote\Result\Builder\ExtractShippingMethods;
use Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface;
Expand Down Expand Up @@ -47,27 +49,36 @@ class Builder
*/
private $itemValidator;

/**
* @var Builder\AddBoldDiscounts
*/
private $addBoldDiscounts;

/**
* @param ResultInterfaceFactory $resultFactory
* @param ErrorInterfaceFactory $errorFactory
* @param ExtractShippingMethods $extractShippingMethods
* @param ExtractCartTotals $extractCartTotals
* @param ProductAttributeMediaGalleryManagementInterface $mediaGalleryManagement
* @param Validator $itemValidator
* @param AddBoldDiscountsExtensionAttribute $addBoldDiscounts
*/
public function __construct(
ResultInterfaceFactory $resultFactory,
ErrorInterfaceFactory $errorFactory,
ExtractShippingMethods $extractShippingMethods,
ExtractCartTotals $extractCartTotals,
ProductAttributeMediaGalleryManagementInterface $mediaGalleryManagement,
Validator $itemValidator
Validator $itemValidator,
AddBoldDiscountsExtensionAttribute $addBoldDiscounts
) {
$this->resultFactory = $resultFactory;
$this->errorFactory = $errorFactory;
$this->extractShippingMethods = $extractShippingMethods;
$this->extractCartTotals = $extractCartTotals;
$this->mediaGalleryManagement = $mediaGalleryManagement;
$this->itemValidator = $itemValidator;
$this->addBoldDiscounts = $addBoldDiscounts;
}

/**
Expand Down Expand Up @@ -131,10 +142,13 @@ private function processQuoteItems(CartInterface $quote): void
if (!$this->itemValidator->shouldAppearInCart($item)) {
continue;
}
$this->addBoldDiscounts->addExtensionAttribute($item);
$parentProduct = null;
if ($item->getParentItem()) {
$parentItem = $item->getParentItem();
$parentDiscounts = $parentItem->getExtensionAttributes()->getBoldDiscounts();
$item->getExtensionAttributes()->setParentItemId($parentItem->getId());
$item->getExtensionAttributes()->setBoldDiscounts($parentDiscounts);
$item->setQty($parentItem->getQty());
$item->setPrice($parentItem->getPrice());
$parentProduct = $parentItem->getProduct();
Expand Down
67 changes: 67 additions & 0 deletions Model/Quote/Result/Builder/AddBoldDiscountsExtensionAttribute.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

declare(strict_types=1);

namespace Bold\Checkout\Model\Quote\Result\Builder;

use Bold\Checkout\Api\Data\DiscountDataInterfaceFactory;
use Bold\Checkout\Api\Data\RuleDiscountInterface;
use Bold\Checkout\Api\Data\RuleDiscountInterfaceFactory;
use Magento\Quote\Model\Quote\Item;

/**
* Add 'bold_discounts' extension attribute to quote item.
*/
class AddBoldDiscountsExtensionAttribute
{
/**
* @var DiscountDataInterfaceFactory
*/
private $discountDataInterfaceFactory;

/**
* @var RuleDiscountInterfaceFactory
*/
private $discountInterfaceFactory;

/**
* @param DiscountDataInterfaceFactory $discountDataInterfaceFactory
* @param RuleDiscountInterfaceFactory $discountInterfaceFactory
*/
public function __construct(
DiscountDataInterfaceFactory $discountDataInterfaceFactory,
RuleDiscountInterfaceFactory $discountInterfaceFactory
) {
$this->discountDataInterfaceFactory = $discountDataInterfaceFactory;
$this->discountInterfaceFactory = $discountInterfaceFactory;
}

/**
* Add 'bold_discounts' extension attribute to quote item.
*
* @param Item $item
* @return void
*/
public function addExtensionAttribute(Item $item): void
{
$data = [
'amount' => $item->getDiscountAmount(),
'base_amount' => $item->getBaseDiscountAmount(),
'original_amount' => $item->getOriginalDiscountAmount(),
'base_original_amount' => $item->getBaseOriginalDiscountAmount()
];
$itemDiscount = $this->discountDataInterfaceFactory->create(['data' => $data]);
$appliedRuleIds = is_array($item->getAppliedRuleIds())
? $item->getAppliedRuleIds()
: explode(',', $item->getAppliedRuleIds());
$ruleLabel = $item->getQuote()->getCouponCode() ?: __('Discount');
$data = [
'discount' => $itemDiscount,
'rule' => $ruleLabel,
'rule_id' => implode(',', $appliedRuleIds),
];
/** @var RuleDiscountInterface $itemDiscount */
$ruleDiscount = $this->discountInterfaceFactory->create(['data' => $data]);
$item->getExtensionAttributes()->setBoldDiscounts([$ruleDiscount]);
}
}
2 changes: 2 additions & 0 deletions etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
<preference for="Bold\Checkout\Api\Catalog\GetProductsInterface" type="Bold\Checkout\Model\Catalog\GetProducts"/>
<preference for="Bold\Checkout\Api\Data\Catalog\GetProductsResultInterface" type="Bold\Checkout\Model\Catalog\GetProducts\Result"/>
<preference for="Bold\Checkout\Api\GetVersionInterface" type="Bold\Checkout\Model\GetVersion"/>
<preference for="Bold\Checkout\Api\Data\DiscountDataInterface" type="Bold\Checkout\Model\Data\DiscountData"/>
<preference for="Bold\Checkout\Api\Data\RuleDiscountInterface" type="Bold\Checkout\Model\Data\RuleDiscount"/>
<type name="Bold\Checkout\Observer\Order\Shipment\FulfillOrderItemsObserver">
<arguments>
<argument name="client" xsi:type="object">Bold\Checkout\Model\Http\BoldClient</argument>
Expand Down
1 change: 1 addition & 0 deletions etc/extension_attributes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<attribute code="tax_details" type="Magento\Tax\Api\Data\AppliedTaxInterface[]"/>
<attribute code="product" type="Magento\Catalog\Api\Data\ProductInterface"/>
<attribute code="parent_item_id" type="int"/>
<attribute code="bold_discounts" type="Bold\Checkout\Api\Data\RuleDiscountInterface[]" />
</extension_attributes>
<extension_attributes for="Magento\Quote\Api\Data\CartInterface">
<attribute code="shipping_tax_amount" type="float"/>
Expand Down

0 comments on commit 39f2859

Please sign in to comment.