Magento 2 - Возникли проблемы со сбором итогов для пользовательского модуля подарочной карты
Я в процессе добавления поддержки системы подарочных карт сторонних производителей. Эти карты никоим образом не будут существовать в контексте Magento, и внешний веб-интерфейс API будет проверять/подтверждать баланс/и т.д.
Имея это в виду, мне просто нужен способ изменить окончательную стоимость заказа, добавив одну или несколько подарочных карт.
Я чувствую, что я близок, но меня очень смущает то, как работает коллекция итогов в отношении \Magento\Quote\Model\Quote
и \Magento\Quote\Model\Quote\Address\Total
, в частности, их ->getBaseGrandTotal()
/->setBaseGrandTotal()
/->getGrandTotal()
/->setGrandTotal()
методы.
$total->get[Base]GrandTotal()
кажется, что всегда возвращается значение null
или 0
, даже после вызова $total->set[Base]GrandTotal(1234)
;
Вот мой текущий метод collect()
, который, похоже, вообще не влияет на общую стоимость заказа.
public function collect(
\Magento\Quote\Model\Quote $quote,
\Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
\Magento\Quote\Model\Quote\Address\Total $total
) {
parent::collect($quote, $shippingAssignment, $total);
$baseGrandTotal = $total->getGrandTotal(); //this is always zero!
$totalGiftCardBalance = $this->_CardSessionHelper->GetTotalAvailableBalanceOfCurrentGiftCards();
$giftCardContribution = min($baseGrandTotal, $totalGiftCardBalance);
//this takes the total viable gift card amount and spreads it over multiple gift cards
//depending on how much balance each one has
$this->_CardSessionHelper->AllocateToGiftCards($giftCardContribution);
//$contribution is a negative value determined by the previous allocation
$contribution = $this->_CardSessionHelper->GetSumOfCurrentGiftCardsContribution();
$total->setGrandTotal($contribution);
$total->setBaseGrandTotal($this->_PriceCurrency->convert($contribution));
return $this;
}
У меня были другие варианты этого метода, которые $quote->set[Base]GrandTotal
, и, казалось, работали по большей части, но попытка разработать дополнительные взносы по подарочным картам после факта привела бы к отрицательным значениям общей суммы котировок, или другие ценности, которые имели мало смысла.
В дополнение к этому, сбор, похоже, происходит несколько раз - я предполагаю, что это связано как с адресами выставления счетов, так и с адресами доставки.
Есть ли способ заставить его работать только для платежного адреса?
1 answers
Собирать Итоги:
Мы должны основываться на адресе доставки.
\Magento\Quote\Model\Quote::collectTotals
( может быть вызван при первом) циклы через каждый адрес котировки (общий адрес котировки):
$total = $this->totalsCollector->collect($this);
\Magento\Quote\Model\Quote\TotalsCollector::collect()
и collectAddressTotals()
будут вызваны для следующего шага
\Magento\Quote\Model\Quote\TotalsCollector::collectAddressTotals()
foreach ($this->collectorList->getCollectors($quote->getStoreId()) as $collector) {
/** @var CollectorInterface $collector */
$collector->collect($quote, $shippingAssignment, $total);
}
В цикле foreach мы получим общее количество собранных данных для каждой общей модели, например: \Magento\Quote\Model\Quote\Address\Total\Subtotal::collect()
, Magento\Weee\Model\Total\Quote\Weee::collect()
, Magento\SalesRule\Model\Quote\Discount::collect()
. Наш пользовательский итог также будет вызван в этом цикле.
Каждая общая модель на основании адреса доставки.
Итак, нам нужно проверить: если у вас есть товары с адресом доставки, мы обработаем пользовательские итоги
Например, в методе сбора нам нужно проверить: vendor/magento/module-sales-rule/Model/Quote/Discount.php
parent::collect($quote, $shippingAssignment, $total);
$items = $shippingAssignment->getItems();
if (!count($items)) {
return $this;
}
Или (можно использовать ваш случай)
if ($shippingAssignment->getShipping()->getAddress()->getAddressType() != Address::TYPE_SHIPPING) {
return $this;
}
Общие Итоги:
Насколько я знаю, общая сумма - это "окончательная" сумма после уплаты налогов, скидки,....
setBaseGrandTotal
: общий итог базируется на базе валюта.setGrandTotal
: базируется на текущей валюте.