'

Все дороги ведут в Checkout Андрей Церкус Magento Developer, Magento Core Team, Magento Inc.

Понравилась презентация – покажи это...





Слайд 0


Слайд 1

Все дороги ведут в Checkout Андрей Церкус Magento Developer, Magento Core Team, Magento Inc.


Слайд 2

Три кита Чекаута Сбор данных Сумма Оплата


Слайд 3

Расчет итоговой суммы Стоимость товаров Скидки Налоги Бонусные программы Сложно. Но лишь на первый взгляд.


Слайд 4

1 - Термины


Слайд 5

Value / Base Value $virtualAmount += $item->getRowTotal(); $baseVirtualAmount += $item->getBaseRowTotal(); … $subtotal = $price * $qty; $baseSubtotal = $basePrice * $qty; Всегда вместе Base = value во внутренней валюте


Слайд 6

Виртуальные товары Виртуальная квота присоединяется к Billing-адресу. Virtual Downloadable (наследник Virtual) Configurable, к которому подключен Virtual Bundle со всеми Virtual Enterprise GiftCard, виртуальный тип


Слайд 7

Nominal item Служит для Recurring Profiles – автоматических платежей с определенным периодом Бета-версия – есть ограничения (только 1 Nominal item в Quote) Собственная система обсчета, базирующаяся на обычной с небольшими отличиями


Слайд 8

Subtotal / Grand Total Subtotal – это стоимость позиций товара Grand Total = Subtotals + все скидки и налоги. То есть, итоговая цена заказа. Не пара, абсолютно разные вещи


Слайд 9

Тax rate Налоговая ставка для комбинации Налогов может быть несколько покупатель тип товара адрес покупателя


Слайд 10

Weee / FPT Фиксированный (не процентный) налог на единицу продукции Модуль Magento – Weee. В интерфейсе – FPT (Fixed Price Tax)


Слайд 11

Цена товаров включает налоги В интерфейсе – Catalog prices including tax Необходимо определять чистую цену товара перед вычислением налогов X = цена Y = налог $100 (задана суммарная стоимость)


Слайд 12

Метод расчета налогов Unit price: ? [(Product Price * Tax Rate) * Qty] Row total: ? [(Product Price * Qty) * Tax Rate] Total: ? (Tax Class Total * Tax Class Rate] – все товары бьются по классам налогообложения, после чего к ним применяются ставки налогов Наличие разных методов – из-за законодательства стран и личных предпочтений владельцев магазинов.


Слайд 13

Ура! Теперь общие термины понятны и не страшны! :)


Слайд 14

2 - Процесс


Слайд 15

Алгоритм Quote Billing & shipping addresses collectTotals() collector 1 collector 2 collector 3 … … … … collector N collectTotals($a)


Слайд 16

Квота перебирает адреса и у каждого вызывает метод collectTotals() Каждый адрес перебирает список моделей-коллекторов и у каждого вызывает метод collectTotals($address) Каждый коллектор выполняет необходимые ему действия. Обычно: перебирает список продуктов и считает значения. Результаты коллектора – внутри себя (временно), в адресе или в продукте.


Слайд 17

Список коллекторов Настраивается в config.xml, как обычно это делается в Magento Можно управлять порядком, так как некоторые основываются на результатах других коллекторов Для построения списка – служебная модель Quote_Address_Total_Collector На данный момент 10 коллекторов в CE и +3 в EE


Слайд 18

Порядок коллекторов


Слайд 19

Mage_Sales_Model_Quote_Address_Total_Nominal Коллектор специально для Nominal Items Реализует свой собственный стек коллекторов, такой же как общий стек квоты Все коллекторы собственного стека – унаследованы от аналогичных коллекторов квоты. Только результаты не выдают наружу во Frontend. Другие коллекторы квоты с Nominal items в основном не работают


Слайд 20

Mage_Sales_Mode_Quote_Address_Total_Subtotal Общая цена позиций 1 телевизор * $100 = $100 2 телефона * $200 = $400 Subtotal: $500


Слайд 21

Mage_SalesRule_Model_Quote_Freeshipping Freeshipping – Да/Нет Правила бесплатной доставки


Слайд 22

Mage_Tax_Model_Sales_Total_Quote_Subtotal Телевизор: $100 incl. tax, $90 excl. tax Телефоны: $400 incl. tax, $310 excl. tax Subtotal: $500 incl.tax, $400 excl.tax Вычисление налогов на subtotal, чтобы разделить subtotal incl. tax и subtotal excl. tax и на них потом правильно начислить скидки


Слайд 23

Mage_Sales_Model_Quote_Address_Total_Shipping Доставка выбранным методом UPS: $20 Вариант UPS Very Quick: $40 Вариант FedEx: $30 Вычисление стоимости доставки, в том числе и вариантов


Слайд 24

Mage_Weee_Model_Total_Quote_Weee 1 телевизор * $10 = $10 Weee Tax 2 телефона * $15 = $30 Weee Tax Вычисление фиксированных налогов


Слайд 25

Mage_Tax_Model_Sales_Total_Quote_Shipping Налог на доставку = стоимость UPS $20 * 10% = $2 Начисление налогов на доставку. Используется Shipping Tax Class, который задается в админке в конфигурации системы.


Слайд 26

Mage_SalesRule_Model_Quote_Discount Скидка по акции за 2 телефона = $400 * -10% = -$40 Подключение всех скидок и купонов


Слайд 27

Mage_Tax_Model_Sales_Total_Quote_Tax Налог на телевизор: ($90 excl. tax + $10 weee) * 10% = $10 Налог на телефоны: ($310 excl. tax + $30 weee - $40 discount) * 20 % = $60 Вычисление всех налогов после применения скидок и Weee


Слайд 28

Mage_Sales_Model_Quote_Address_Total_Grand Телевизор: $90 Телефоны: $310 Доставка: $20 Weee: $40 Discount: -$40 Налоги: $72 ------------------- Grand Total (Итого): $572 Суммирование всех величин для показа итога суммы покупателю


Слайд 29

Enterprise: Rewards, GiftCard, CustomerBalance GrandTotal: $572 Rewards: -$22 GiftCard: -$20 Balance: -$31 ------------------------ Grand Total (Итого): $499 Возможность оплаты бонусами, подарочными картами и со своего счета в магазине


Слайд 30

Ура! Теперь и процесс понятен! :)


Слайд 31

2. P.S. – Спецтермины налогов


Слайд 32

Rounding Deltas


Слайд 33

Rounding Deltas $delta = 0; foreach ($items as $item) { $realTax = $item->getPrice() * $taxRate; $tax = round($realTax + $delta, 2); $delta = $realTax - $tax; } Стабилизация ошибки округления


Слайд 34

Чистая цена товара при Catalog Prices incl. tax X = цена Y = налог $100 (задана суммарная стоимость) Как найти цену из стоимости с налогом?


Слайд 35

Magento считает, что стоимость товара указана включая налог, который действует на Retail Customer, находящегося в Shipping Origin. Имея связку “покупатель-класс продукта –адрес” Magento находит соответствующие ставки налогов. Налоги вычитаются и получается чистая цена. С ней можно работать уже дальше. * Оптимизация – если покупатель такой же, то налог сразу берется как разница стоимости и чистой цены.


Слайд 36

3 – Сам!


Слайд 37

Идея Хотим красиво упаковывать товары! платит за упаковку покупатель каждому товару добавим атрибут “wrapping_price”. Сумму выставляет админ в зависимости от оценки сложности работы и количества расходуемого материала.


Слайд 38

Реализация Помним основы Magento: свой неймспейс (Zerkella) наш модуль – в локальном codepool: app/code/local Итого модуль Zerkella_Wrapping в app/code/local/Zerkella_Wrapping


Слайд 39

Подключение в коллекторы – в config.xml. Путь ноды: config/global/sales/quote/totals <sales> <quote> <totals> <wrapping> <class>zerkella_wrapping/total_wrapping</class> <before>grand_total</before> </wrapping> </totals> </quote> </sales>


Слайд 40

‘wrapping’ – код коллектора Можно использовать <before> и <after> Можно в них через запятую перечислять коды коллекторов Наша модель коллектора: class Zerkella_Wrapping_Model_Total_Wrapping extends Mage_Sales_Model_Quote_Address_Total_Abstract


Слайд 41

Обязательный метод collect(): $totalWPrice = 0; $totalWBasePrice = 0; foreach ($this->_getAddressItems($address) as $item) { if ($item->getProduct()->isVirtual()) { continue; } $wrappingBasePrice = $item->getProduct()->getWrappingPrice() * $item->getQty(); $totalWBasePrice += $wrappingBasePrice; $totalWPrice += $address->getQuote()->getStore()->convertPrice($wrappingBasePrice, false); } $this->_setAmount($totalWPrice)->setBaseAmount($totalWBasePrice);


Слайд 42

Пусть будет видно на фронте, метод fetch(): $amount = $address->getWrappingAmount(); if ($amount != 0) { $title = Mage::helper('zerkella_wrapping')->__('Wrapping'); $address->addTotal(array( 'code' => $this->getCode(), 'title' => $title, 'value' => $amount )); } Иии...


Слайд 43


Слайд 44


Слайд 45

Напоследок Легко, но лишь начало: модели для nominals, инвойсов, shipping, refunds (creditmemo) и генерации pdf Только цельный $quote->collectTotals() гарантирует правильность расчета. Но не $address->collectTotals() Помнить, что может быть много collectTotals() – кешировать ресурсоемкие результаты


Слайд 46

Спасибо Андрей Церкус, skype: andrey.tserkus Magento Developer, Magento Core Team, Magento Inc.


Слайд 47


×

HTML:





Ссылка: