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

Содержание

Слайд 2

Все дороги ведут в Checkout

Андрей Церкус
Magento Developer, Magento Core Team,
Magento Inc.

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

Слайд 3

Три кита Чекаута

Сбор данных

Сумма

Оплата

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

Слайд 4

Расчет итоговой суммы

Стоимость товаров
Скидки
Налоги
Бонусные программы

Сложно.
Но лишь на первый взгляд.

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

Слайд 5

1 - Термины

1 - Термины

Слайд 6

Value / Base Value

$virtualAmount += $item->getRowTotal();
$baseVirtualAmount += $item->getBaseRowTotal();

$subtotal = $price * $qty;
$baseSubtotal

Value / Base Value $virtualAmount += $item->getRowTotal(); $baseVirtualAmount += $item->getBaseRowTotal(); … $subtotal
= $basePrice * $qty;

Всегда вместе
Base = value во внутренней валюте

Слайд 7

Виртуальные товары

Виртуальная квота присоединяется к Billing-адресу.

Virtual
Downloadable (наследник Virtual)
Configurable, к которому подключен Virtual
Bundle

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

Слайд 8

Nominal item

Служит для Recurring Profiles – автоматических платежей с определенным периодом
Бета-версия –

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

Слайд 9

Subtotal / Grand Total

Subtotal – это стоимость позиций товара
Grand Total = Subtotals

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

Не пара, абсолютно разные вещи

Слайд 10

Тax rate

Налоговая ставка для комбинации
Налогов может быть несколько

покупатель

тип товара

адрес
покупателя

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

Слайд 11

Weee / FPT

Фиксированный (не процентный) налог на единицу продукции
Модуль Magento – Weee.

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

Слайд 12

Цена товаров включает налоги

В интерфейсе – Catalog prices including tax
Необходимо определять чистую

Цена товаров включает налоги В интерфейсе – Catalog prices including tax Необходимо
цену товара перед вычислением налогов

X = цена

Y = налог

$100 (задана суммарная стоимость)

Слайд 13

Метод расчета налогов

Unit price: ∑ [(Product Price * Tax Rate) * Qty]
Row

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

Слайд 14

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

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

Слайд 15

2 - Процесс

2 - Процесс

Слайд 16

Алгоритм

Quote

Billing & shipping addresses

collectTotals()

collector 1

collector 2

collector 3




collector N

collectTotals($a)

Алгоритм Quote Billing & shipping addresses collectTotals() collector 1 collector 2 collector

Слайд 17

Квота перебирает адреса и у каждого вызывает метод collectTotals()
Каждый адрес перебирает список

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

Слайд 18

Список коллекторов

Настраивается в config.xml, как обычно это делается в Magento
Можно управлять порядком,

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

Слайд 19

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

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

Слайд 20

Mage_Sales_Model_Quote_Address_Total_Nominal

Коллектор специально для Nominal Items
Реализует свой собственный стек коллекторов, такой же как

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

Слайд 21

Mage_Sales_Mode_Quote_Address_Total_Subtotal

Общая цена позиций

1 телевизор * $100 = $100
2 телефона * $200 =

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

Слайд 22

Mage_SalesRule_Model_Quote_Freeshipping

Freeshipping – Да/Нет

Правила бесплатной доставки

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

Слайд 23

Mage_Tax_Model_Sales_Total_Quote_Subtotal

Телевизор: $100 incl. tax, $90 excl. tax
Телефоны: $400 incl. tax, $310 excl.

Mage_Tax_Model_Sales_Total_Quote_Subtotal Телевизор: $100 incl. tax, $90 excl. tax Телефоны: $400 incl. tax,
tax
Subtotal: $500 incl.tax, $400 excl.tax

Вычисление налогов на subtotal, чтобы разделить subtotal incl. tax и subtotal excl. tax и на них потом правильно начислить скидки

Слайд 24

Mage_Sales_Model_Quote_Address_Total_Shipping

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

Вычисление стоимости

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

Слайд 25

Mage_Weee_Model_Total_Quote_Weee

1 телевизор * $10 = $10 Weee Tax
2 телефона * $15 =

Mage_Weee_Model_Total_Quote_Weee 1 телевизор * $10 = $10 Weee Tax 2 телефона *
$30 Weee Tax

Вычисление фиксированных налогов

Слайд 26

Mage_Tax_Model_Sales_Total_Quote_Shipping

Налог на доставку = стоимость UPS $20 * 10% = $2

Начисление налогов

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

Слайд 27

Mage_SalesRule_Model_Quote_Discount

Скидка по акции за 2 телефона = $400 * -10% = -$40

Подключение

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

Слайд 28

Mage_Tax_Model_Sales_Total_Quote_Tax

Налог на телевизор: ($90 excl. tax + $10 weee) * 10% =

Mage_Tax_Model_Sales_Total_Quote_Tax Налог на телевизор: ($90 excl. tax + $10 weee) * 10%
$10
Налог на телефоны: ($310 excl. tax + $30 weee - $40 discount) * 20 % = $60

Вычисление всех налогов после применения скидок и Weee

Слайд 29

Mage_Sales_Model_Quote_Address_Total_Grand

Телевизор: $90
Телефоны: $310
Доставка: $20
Weee: $40
Discount: -$40
Налоги: $72
-------------------
Grand Total (Итого): $572

Суммирование всех величин

Mage_Sales_Model_Quote_Address_Total_Grand Телевизор: $90 Телефоны: $310 Доставка: $20 Weee: $40 Discount: -$40 Налоги:
для показа итога суммы покупателю

Слайд 30

Enterprise: Rewards, GiftCard, CustomerBalance

GrandTotal: $572
Rewards: -$22
GiftCard: -$20
Balance: -$31
------------------------
Grand Total (Итого): $499

Возможность оплаты

Enterprise: Rewards, GiftCard, CustomerBalance GrandTotal: $572 Rewards: -$22 GiftCard: -$20 Balance: -$31
бонусами, подарочными картами и со своего счета в магазине

Слайд 31

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

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

Слайд 32

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

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

Слайд 33

Rounding Deltas

Rounding Deltas

Слайд 34

Rounding Deltas

$delta = 0;
foreach ($items as $item) {
$realTax = $item->getPrice() *

Rounding Deltas $delta = 0; foreach ($items as $item) { $realTax =
$taxRate;
$tax = round($realTax + $delta, 2);
$delta = $realTax - $tax;
}

Стабилизация ошибки округления

Слайд 35

Чистая цена товара при
Catalog Prices incl. tax

X = цена

Y = налог

$100

Чистая цена товара при Catalog Prices incl. tax X = цена Y
(задана суммарная стоимость)

Как найти цену из стоимости с налогом?

Слайд 36

Magento считает, что стоимость товара указана включая налог, который действует на Retail

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

Слайд 37

3 – Сам!

3 – Сам!

Слайд 38

Идея

Хотим красиво упаковывать товары!

платит за упаковку покупатель
каждому товару добавим атрибут “wrapping_price”. Сумму

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

Слайд 39

Реализация

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

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

Слайд 40

Подключение в коллекторы – в config.xml.
Путь ноды: config/global/sales/quote/totals





zerkella_wrapping/total_wrapping

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




Слайд 41

‘wrapping’ – код коллектора
Можно использовать и
Можно в них через запятую

‘wrapping’ – код коллектора Можно использовать и Можно в них через запятую
перечислять коды коллекторов
Наша модель коллектора:

class Zerkella_Wrapping_Model_Total_Wrapping extends Mage_Sales_Model_Quote_Address_Total_Abstract

Слайд 42

Обязательный метод collect():

$totalWPrice = 0;
$totalWBasePrice = 0;
foreach ($this->_getAddressItems($address) as $item) {
if

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

Слайд 43

Пусть будет видно на фронте, метод fetch():

$amount = $address->getWrappingAmount();
if ($amount != 0)

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

Иии...

Слайд 46

Напоследок

Легко, но лишь начало: модели для nominals, инвойсов, shipping, refunds (creditmemo) и

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

Слайд 47

Спасибо

Андрей Церкус, skype: andrey.tserkus
Magento Developer, Magento Core Team,
Magento Inc.

Спасибо Андрей Церкус, skype: andrey.tserkus Magento Developer, Magento Core Team, Magento Inc.
Имя файла: Все-дороги-ведут-в-Checkout-Андрей-Церкус-Magento-Developer,-Magento-Core-Team,-Magento-Inc.---презентация.pptx
Количество просмотров: 1160
Количество скачиваний: 1