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, и, казалось, работали по большей части, но попытка разработать дополнительные взносы по подарочным картам после факта привела бы к отрицательным значениям общей суммы котировок, или другие ценности, которые имели мало смысла.

В дополнение к этому, сбор, похоже, происходит несколько раз - я предполагаю, что это связано как с адресами выставления счетов, так и с адресами доставки.

Есть ли способ заставить его работать только для платежного адреса?

Author: Teja Bhagavan Kollepara, 2017-02-16

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 : базируется на текущей валюте.

 3
Author: Khoa TruongDinh, 2017-02-19 10:40:46