SlideShare une entreprise Scribd logo
1  sur  48
Все дороги ведут в Checkout Андрей Церкус Magento Developer,Magento Core Team, Magento Inc.
Три кита Чекаута Сбор данных Сумма Оплата
Расчет итоговой суммы Стоимость товаров Скидки Налоги Бонусные программы Сложно.  Но лишь на первый взгляд.
1 - Термины
Value / Base Value ,[object Object]
Base = value во внутренней валюте$virtualAmount += $item->getRowTotal(); $baseVirtualAmount += $item->getBaseRowTotal(); … $subtotal = $price * $qty; $baseSubtotal = $basePrice * $qty;
Виртуальныетовары ,[object Object]
Downloadable (наследник Virtual)
Configurable,к которому подключенVirtual
Bundle со всеми Virtual
Enterprise GiftCard, виртуальный типВиртуальная квота присоединяется к Billing-адресу.
Nominal item Служит для Recurring Profiles – автоматических платежей с определенным периодом Бета-версия – есть ограничения (только 1 Nominal item в Quote) Собственная система обсчета, базирующаяся на обычной с небольшими отличиями
Subtotal/ Grand Total ,[object Object]
Subtotal – это стоимость позицийтовара
Grand Total = Subtotals + все скидки и налоги. То есть, итоговая цена заказа.,[object Object]
Weee / FPT Фиксированный (не процентный) налог на единицу продукции Модуль Magento – Weee. В интерфейсе – FPT (Fixed Price Tax)
Цена товаров включает налоги X = цена Y = налог $100(задана суммарная стоимость) В интерфейсе – Catalog prices including tax Необходимо определять чистую цену товара перед вычислением налогов
Метод расчета налогов Unit price:  ∑ [(Product Price * Tax Rate) * Qty] Row total: ∑ [(Product Price * Qty) * Tax Rate] Total: ∑ (Tax Class Total * Tax Class Rate] – все товары бьются по классам налогообложения, после чего к ним применяютсяставки налогов Наличие разных методов – из-за законодательства стран и личных предпочтений владельцев магазинов.
Ура! Теперь общие термины понятны и не страшны!:)
2 - Процесс
Алгоритм Quote collector 1 collector 2 collectTotals() collector 3 … … … … Billing & shipping addresses collectTotals($a) collector N
Квота перебирает адреса и у каждого вызывает метод collectTotals() Каждый адрес перебирает список моделей-коллекторов и у каждого вызывает метод collectTotals($address) Каждый коллектор выполняет необходимые ему действия. Обычно: перебирает список продуктов и считает значения. Результаты коллектора – внутри себя (временно), в адресе или в продукте.
Список коллекторов Настраивается в config.xml, как обычно это делается в Magento Можно управлять порядком, так как некоторые основываются на результатах других коллекторов Для построения списка – служебная модель Quote_Address_Total_Collector На данный момент 10 коллекторов в CE и +3 в EE
Порядок коллекторов
Mage_Sales_Model_Quote_Address_Total_Nominal Коллектор специально для Nominal Items Реализует свой собственный стек коллекторов, такой же как общий стек квоты Все коллекторы собственного стека – унаследованы от аналогичных коллекторов квоты. Только результаты не выдают наружу во Frontend. Другие коллекторы квоты с Nominal items в основном не работают
Mage_Sales_Mode_Quote_Address_Total_Subtotal Общая цена позиций 1 телевизор * $100 = $100 2 телефона * $200 = $400 Subtotal: $500
Mage_SalesRule_Model_Quote_Freeshipping Правила бесплатной доставки Freeshipping – Да/Нет
Mage_Tax_Model_Sales_Total_Quote_Subtotal Вычисление налогов на subtotal, чтобы разделить subtotal incl. tax и subtotal excl. tax и на них потом правильно начислить скидки Телевизор: $100incl. tax, $90 excl. tax Телефоны: $400incl. tax, $310 excl. tax Subtotal: $500 incl.tax, $400 excl.tax
Mage_Sales_Model_Quote_Address_Total_Shipping Вычисление стоимости доставки, в том числе и вариантов Доставка выбранным методом UPS: $20 Вариант UPS Very Quick: $40 Вариант FedEx: $30
Mage_Weee_Model_Total_Quote_Weee Вычисление фиксированных налогов 1 телевизор * $10 = $10Weee Tax 2 телефона * $15 = $30 Weee Tax
Mage_Tax_Model_Sales_Total_Quote_Shipping Начисление налогов на доставку. Используется Shipping Tax Class, который задается в админке в конфигурации системы. Налог на доставку = стоимость UPS $20 * 10% = $2
Mage_SalesRule_Model_Quote_Discount Подключение всех скидок и купонов Скидка по акции за 2 телефона = $400 * -10% = -$40
Mage_Tax_Model_Sales_Total_Quote_Tax Вычисление всех налогов после применения скидоки Weee Налог на телевизор: ($90excl. tax + $10weee) * 10% = $10 Налог на телефоны: ($310 excl. tax + $30 weee - $40 discount) * 20 % = $60
Mage_Sales_Model_Quote_Address_Total_Grand Суммирование всех величин для показа итога суммы покупателю Телевизор: $90 Телефоны: $310 Доставка: $20 Weee: $40 Discount: -$40 Налоги: $72 ------------------- Grand Total (Итого): $572
Enterprise: Rewards, GiftCard, CustomerBalance Возможность оплаты бонусами, подарочными картами и со своего счета в магазине GrandTotal: $572 Rewards: -$22 GiftCard: -$20 Balance: -$31 ------------------------ Grand Total (Итого): $499
Ура! Теперь и процесс понятен!:)
2. P.S. – Спецтермины налогов
Rounding Deltas
Rounding Deltas Стабилизация ошибки округления $delta = 0; foreach ($items as $item) {     $realTax = $item->getPrice() * $taxRate;     $tax = round($realTax + $delta, 2);     $delta = $realTax - $tax; }
Чистая цена товара при  Catalog Prices incl. tax X = цена Y = налог $100(задана суммарная стоимость) Как найти цену из стоимости с налогом?
Magentoсчитает, что стоимость товара указана включая налог, который действует на Retail Customer, находящегося в Shipping Origin. Имея связку “покупатель-класс продукта –адрес” Magento находит соответствующие ставки налогов. Налоги вычитаются и получается чистая цена. С ней можно работать уже дальше. * Оптимизация – если покупатель такой же, то налог сразу берется как разница стоимости и чистой цены.
3 – Сам!
Идея Хотим красиво упаковывать товары! ,[object Object]
каждому товару добавим атрибут “wrapping_price”. Сумму выставляет админ в зависимости от оценки сложности работы и количества расходуемого материала.,[object Object]
Подключение в коллекторы – в 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>
‘wrapping’ – код коллектора Можно использовать <before> и <after> Можно в них через запятую перечислять коды коллекторов Наша модель коллектора: class Zerkella_Wrapping_Model_Total_Wrapping extends Mage_Sales_Model_Quote_Address_Total_Abstract
Обязательный метод 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);

Contenu connexe

Tendances

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoMoscowDjango
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in MagentoVrann Tulika
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf Conference
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Yii2
Yii2Yii2
Yii2Noveo
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософияPaul Klimov
 

Tendances (20)

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
 
Yii development
Yii developmentYii development
Yii development
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Dependency injection, phemto
Dependency injection, phemtoDependency injection, phemto
Dependency injection, phemto
 
Render API.
Render API.Render API.
Render API.
 
Javascript
JavascriptJavascript
Javascript
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Yii2
Yii2Yii2
Yii2
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Survive with OOP
Survive with OOPSurvive with OOP
Survive with OOP
 

En vedette

1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни MagentoMagecom Ukraine
 
Управление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessУправление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessMagecom Ukraine
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в MagentoMagecom Ukraine
 
Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Magecom Ukraine
 
Преимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахПреимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахMagecom Ukraine
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0zfconfua
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2zfconfua
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...zfconfua
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингzfconfua
 
Применение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийПрименение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийKirill Klimov
 
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)zfconfua
 
Мобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновМобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновMagecom Ukraine
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Magecom Ukraine
 
Применение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовПрименение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовMagecom Ukraine
 
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)zfconfua
 

En vedette (16)

1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento
 
Управление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessУправление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified Process
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в Magento
 
Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...
 
Преимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахПреимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинах
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
 
Применение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийПрименение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложений
 
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)
 
Мобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновМобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазинов
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?
 
Применение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовПрименение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисов
 
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)
 

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

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
Отслеживание эффективности каждой площадки партнерской сети Бегуна и Яндекс....
Отслеживание эффективности каждой  площадки партнерской сети Бегуна и Яндекс....Отслеживание эффективности каждой  площадки партнерской сети Бегуна и Яндекс....
Отслеживание эффективности каждой площадки партнерской сети Бегуна и Яндекс....Cossa
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debuggingaheadWorks
 
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...Prom
 
Контекстная реклама и аналитика для интернет магазинов
Контекстная реклама и аналитика для интернет магазиновКонтекстная реклама и аналитика для интернет магазинов
Контекстная реклама и аналитика для интернет магазиновPromodo
 
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»Вебинар «Контекстная реклама и аналитика для интернет-магазинов»
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»Promodo
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Поисковая оптимизация интернет-магазины на базе Drupal Commerce
Поисковая оптимизация интернет-магазины на базе Drupal CommerceПоисковая оптимизация интернет-магазины на базе Drupal Commerce
Поисковая оптимизация интернет-магазины на базе Drupal CommercePVasili
 
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...InSales
 
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...B2CPL
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюГлеб Тарасов
 
ТоргСофт программа учета для магазина обуви, одежды
ТоргСофт программа учета для магазина обуви, одеждыТоргСофт программа учета для магазина обуви, одежды
ТоргСофт программа учета для магазина обуви, одеждыКомпания ТоргСофт
 
Поисковая оптимизация интернет-магазина на базе Drupal Commerce
Поисковая оптимизация интернет-магазина на базе Drupal CommerceПоисковая оптимизация интернет-магазина на базе Drupal Commerce
Поисковая оптимизация интернет-магазина на базе Drupal CommerceAlexey Kostin
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятPavel Bashmakov
 

Similaire à Все дороги ведут в Checkout (20)

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Отслеживание эффективности каждой площадки партнерской сети Бегуна и Яндекс....
Отслеживание эффективности каждой  площадки партнерской сети Бегуна и Яндекс....Отслеживание эффективности каждой  площадки партнерской сети Бегуна и Яндекс....
Отслеживание эффективности каждой площадки партнерской сети Бегуна и Яндекс....
 
22apr s51-a-sergeev-110426092204-phpapp01
22apr s51-a-sergeev-110426092204-phpapp0122apr s51-a-sergeev-110426092204-phpapp01
22apr s51-a-sergeev-110426092204-phpapp01
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...
Александр Кулик “Основные виды интернет-рекламы. Как отслеживать ее эффективн...
 
Контекстная реклама и аналитика для интернет магазинов
Контекстная реклама и аналитика для интернет магазиновКонтекстная реклама и аналитика для интернет магазинов
Контекстная реклама и аналитика для интернет магазинов
 
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»Вебинар «Контекстная реклама и аналитика для интернет-магазинов»
Вебинар «Контекстная реклама и аналитика для интернет-магазинов»
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Поисковая оптимизация интернет-магазины на базе Drupal Commerce
Поисковая оптимизация интернет-магазины на базе Drupal CommerceПоисковая оптимизация интернет-магазины на базе Drupal Commerce
Поисковая оптимизация интернет-магазины на базе Drupal Commerce
 
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...
04_Фильченков К._b2cpl_Доставка интернет-магазина.Как оптимизировать прибыль ...
 
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...
Вебинар "Как открыть интернет магазин": вопросы доставки, контакт-центра и фу...
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
ТоргСофт программа учета для магазина обуви, одежды
ТоргСофт программа учета для магазина обуви, одеждыТоргСофт программа учета для магазина обуви, одежды
ТоргСофт программа учета для магазина обуви, одежды
 
MWWM
MWWMMWWM
MWWM
 
Поисковая оптимизация интернет-магазина на базе Drupal Commerce
Поисковая оптимизация интернет-магазина на базе Drupal CommerceПоисковая оптимизация интернет-магазина на базе Drupal Commerce
Поисковая оптимизация интернет-магазина на базе Drupal Commerce
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едят
 
Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​Как повысить эффективность рекламных кампаний​
Как повысить эффективность рекламных кампаний​
 

Plus de Magecom Ukraine

10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверейMagecom Ukraine
 
Flexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceFlexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceMagecom Ukraine
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Magecom Ukraine
 
Деплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийДеплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийMagecom Ukraine
 
Расширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияРасширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияMagecom Ukraine
 
Тестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumТестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumMagecom Ukraine
 
Архитектура веб-приложений на примере Zend Framework и Magento
Архитектура веб-приложений  на примере Zend Framework и MagentoАрхитектура веб-приложений  на примере Zend Framework и Magento
Архитектура веб-приложений на примере Zend Framework и MagentoMagecom Ukraine
 
Extension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОExtension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОMagecom Ukraine
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхMagecom Ukraine
 

Plus de Magecom Ukraine (9)

10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей
 
Flexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceFlexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open Source
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
 
Деплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийДеплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложений
 
Расширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияРасширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложения
 
Тестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumТестирование Magento с использованием Selenium
Тестирование Magento с использованием Selenium
 
Архитектура веб-приложений на примере Zend Framework и Magento
Архитектура веб-приложений  на примере Zend Framework и MagentoАрхитектура веб-приложений  на примере Zend Framework и Magento
Архитектура веб-приложений на примере Zend Framework и Magento
 
Extension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОExtension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПО
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
 

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

  • 1.
  • 2. Все дороги ведут в Checkout Андрей Церкус Magento Developer,Magento Core Team, Magento Inc.
  • 3. Три кита Чекаута Сбор данных Сумма Оплата
  • 4. Расчет итоговой суммы Стоимость товаров Скидки Налоги Бонусные программы Сложно. Но лишь на первый взгляд.
  • 6.
  • 7. Base = value во внутренней валюте$virtualAmount += $item->getRowTotal(); $baseVirtualAmount += $item->getBaseRowTotal(); … $subtotal = $price * $qty; $baseSubtotal = $basePrice * $qty;
  • 8.
  • 12. Enterprise GiftCard, виртуальный типВиртуальная квота присоединяется к Billing-адресу.
  • 13. Nominal item Служит для Recurring Profiles – автоматических платежей с определенным периодом Бета-версия – есть ограничения (только 1 Nominal item в Quote) Собственная система обсчета, базирующаяся на обычной с небольшими отличиями
  • 14.
  • 15. Subtotal – это стоимость позицийтовара
  • 16.
  • 17. Weee / FPT Фиксированный (не процентный) налог на единицу продукции Модуль Magento – Weee. В интерфейсе – FPT (Fixed Price Tax)
  • 18. Цена товаров включает налоги X = цена Y = налог $100(задана суммарная стоимость) В интерфейсе – Catalog prices including tax Необходимо определять чистую цену товара перед вычислением налогов
  • 19. Метод расчета налогов Unit price: ∑ [(Product Price * Tax Rate) * Qty] Row total: ∑ [(Product Price * Qty) * Tax Rate] Total: ∑ (Tax Class Total * Tax Class Rate] – все товары бьются по классам налогообложения, после чего к ним применяютсяставки налогов Наличие разных методов – из-за законодательства стран и личных предпочтений владельцев магазинов.
  • 20. Ура! Теперь общие термины понятны и не страшны!:)
  • 22. Алгоритм Quote collector 1 collector 2 collectTotals() collector 3 … … … … Billing & shipping addresses collectTotals($a) collector N
  • 23. Квота перебирает адреса и у каждого вызывает метод collectTotals() Каждый адрес перебирает список моделей-коллекторов и у каждого вызывает метод collectTotals($address) Каждый коллектор выполняет необходимые ему действия. Обычно: перебирает список продуктов и считает значения. Результаты коллектора – внутри себя (временно), в адресе или в продукте.
  • 24. Список коллекторов Настраивается в config.xml, как обычно это делается в Magento Можно управлять порядком, так как некоторые основываются на результатах других коллекторов Для построения списка – служебная модель Quote_Address_Total_Collector На данный момент 10 коллекторов в CE и +3 в EE
  • 26. Mage_Sales_Model_Quote_Address_Total_Nominal Коллектор специально для Nominal Items Реализует свой собственный стек коллекторов, такой же как общий стек квоты Все коллекторы собственного стека – унаследованы от аналогичных коллекторов квоты. Только результаты не выдают наружу во Frontend. Другие коллекторы квоты с Nominal items в основном не работают
  • 27. Mage_Sales_Mode_Quote_Address_Total_Subtotal Общая цена позиций 1 телевизор * $100 = $100 2 телефона * $200 = $400 Subtotal: $500
  • 29. Mage_Tax_Model_Sales_Total_Quote_Subtotal Вычисление налогов на subtotal, чтобы разделить subtotal incl. tax и subtotal excl. tax и на них потом правильно начислить скидки Телевизор: $100incl. tax, $90 excl. tax Телефоны: $400incl. tax, $310 excl. tax Subtotal: $500 incl.tax, $400 excl.tax
  • 30. Mage_Sales_Model_Quote_Address_Total_Shipping Вычисление стоимости доставки, в том числе и вариантов Доставка выбранным методом UPS: $20 Вариант UPS Very Quick: $40 Вариант FedEx: $30
  • 31. Mage_Weee_Model_Total_Quote_Weee Вычисление фиксированных налогов 1 телевизор * $10 = $10Weee Tax 2 телефона * $15 = $30 Weee Tax
  • 32. Mage_Tax_Model_Sales_Total_Quote_Shipping Начисление налогов на доставку. Используется Shipping Tax Class, который задается в админке в конфигурации системы. Налог на доставку = стоимость UPS $20 * 10% = $2
  • 33. Mage_SalesRule_Model_Quote_Discount Подключение всех скидок и купонов Скидка по акции за 2 телефона = $400 * -10% = -$40
  • 34. Mage_Tax_Model_Sales_Total_Quote_Tax Вычисление всех налогов после применения скидоки Weee Налог на телевизор: ($90excl. tax + $10weee) * 10% = $10 Налог на телефоны: ($310 excl. tax + $30 weee - $40 discount) * 20 % = $60
  • 35. Mage_Sales_Model_Quote_Address_Total_Grand Суммирование всех величин для показа итога суммы покупателю Телевизор: $90 Телефоны: $310 Доставка: $20 Weee: $40 Discount: -$40 Налоги: $72 ------------------- Grand Total (Итого): $572
  • 36. Enterprise: Rewards, GiftCard, CustomerBalance Возможность оплаты бонусами, подарочными картами и со своего счета в магазине GrandTotal: $572 Rewards: -$22 GiftCard: -$20 Balance: -$31 ------------------------ Grand Total (Итого): $499
  • 37. Ура! Теперь и процесс понятен!:)
  • 38. 2. P.S. – Спецтермины налогов
  • 40. Rounding Deltas Стабилизация ошибки округления $delta = 0; foreach ($items as $item) { $realTax = $item->getPrice() * $taxRate; $tax = round($realTax + $delta, 2); $delta = $realTax - $tax; }
  • 41. Чистая цена товара при Catalog Prices incl. tax X = цена Y = налог $100(задана суммарная стоимость) Как найти цену из стоимости с налогом?
  • 42. Magentoсчитает, что стоимость товара указана включая налог, который действует на Retail Customer, находящегося в Shipping Origin. Имея связку “покупатель-класс продукта –адрес” Magento находит соответствующие ставки налогов. Налоги вычитаются и получается чистая цена. С ней можно работать уже дальше. * Оптимизация – если покупатель такой же, то налог сразу берется как разница стоимости и чистой цены.
  • 44.
  • 45.
  • 46. Подключение в коллекторы – в 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>
  • 47. ‘wrapping’ – код коллектора Можно использовать <before> и <after> Можно в них через запятую перечислять коды коллекторов Наша модель коллектора: class Zerkella_Wrapping_Model_Total_Wrapping extends Mage_Sales_Model_Quote_Address_Total_Abstract
  • 48. Обязательный метод 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);
  • 49. Пусть будет видно на фронте, метод fetch(): $amount = $address->getWrappingAmount(); if ($amount != 0) { $title = Mage::helper('zerkella_wrapping')->__('Wrapping'); $address->addTotal(array( 'code' => $this->getCode(), 'title' => $title, 'value' => $amount )); } Иии...
  • 50.
  • 51.
  • 52. Напоследок Легко, но лишь начало: модели для nominals, инвойсов, shipping, refunds (creditmemo) и генерации pdf Только цельный $quote->collectTotals() гарантирует правильность расчета. Но не $address->collectTotals() Помнить, что может быть много collectTotals() – кешировать ресурсоемкие результаты
  • 53. Спасибо Андрей Церкус, skype: andrey.tserkus Magento Developer,Magento Core Team, Magento Inc.