Magento – получить ценовые правила от заказа

кто-нибудь знает, как можно получить правила цены на каталог и корзину из заказа?

Я знаю, что я могу получить процент скидки от элемента заказа с помощью метода getDiscountPercent() , но как я могу получить все правила, которые были применены ко всему порядку?

Например, у меня есть правило «Клиентская группа X получает 20% всех предметов в магазине».

Теперь я хочу определить, какие правила были фактически применены, когда заказ был отправлен пользователем. Мне нужно это для интерфейса экспорта заказов, где я должен предоставить все скидки, которые пользователь получил.

Заранее спасибо!

Solutions Collecting From Web of "Magento – получить ценовые правила от заказа"

Посмотрите в таблице sales_flat_order_item . есть поле под названием applied_rule_ids которое даст вам идентификатор правила, применяемого к этому элементу. Также вы можете узнать в этой таблице, сколько скидок было применено и процент.

пример

 //The order I want to check $order_id = 859; //Get the list of items for your order $items = Mage::getModel('sales/order_item') ->getCollection() ->addFilter('order_id',array('eq'=>$order_id)); //loop through each item foreach($items as $item){ //if the item has not had a rule applied to it skip it if($item->getAppliedRuleIds() == '')continue; /* * I cant remember in the database they might be comma separated or space if multiple rules were applied * the getAppliedRuleIds() function is the one you want */ foreach(explode(",",$item->getAppliedRuleIds()) as $ruleID){ //Load the rule object $rule = Mage::getModel('catalogrule/rule')->load($ruleID); // Throw out some information like the rule name what product it was applied to echo "<p>".$item->getSku()." had rule ".$rule->getName()."(".$item->getAppliedRuleIds().") applied </p>"; } } 
 /* Example of getting catalog rules applied for specific product */ $productId = 6; $user = Mage::getSingleton('customer/session')->getCustomer(); $product = Mage::getModel('catalog/product')->load($productId); $storeId = $product->getStoreId(); $websiteId = Mage::app()->getStore($storeId)->getWebsiteId(); $dateTs = Mage::app()->getLocale()->storeTimeStamp($storeId); $customerGroupId = $user->getGroupId(); $resource = Mage::getResourceModel('catalogrule/rule'); $rules = $resource->getRulesFromProduct($dateTs, $websiteId, $customerGroupId, $productId); 

Да, это отчасти боль, которую Magento не оставляет в истории заказов, когда вы используете расценки на продажу относительно того, как была рассчитана эта базовая цена.

К счастью, это с открытым исходным кодом, поэтому вы можете исправить это, если хотите.

Недавно я написал наблюдателя, который срабатывает при загрузке записи заказа, чтобы решить эту проблему. Он перекрестно ссылается на строку base_price с текущей полной розничной ценой продукта. Если есть несоответствие, он добавляет пару полей в элемент заказа, чтобы помочь разоблачить эту информацию любому внешнему скрипту, который прослушивает (в нашем случае – скрипт выполнения пользовательских заказов, который передает заказы в SAP с использованием SOAP API Magento).

Вот основная идея – создать модуль в app/code/local/YourCo/SalePricing

и настройте класс наблюдателя в app/code/local/YourCo/SalePricing/Model/Promo/Observer.php

 <?php class YourCo_SalePricing_Model_Promo_Observer { public function __construct() { } // tag order items that have a sale-price // with original retail price and total sale discount for this line public function report_sale_pricing($observer) { $event = $observer->getEvent(); $order = $event->getOrder(); $items = $order->getAllItems(); foreach ($items as $item) { // heads up, you may want to do this for other types as well... if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE) { $regular_price = $this->_lookupFullRetail($item,$order->getStoreId()); $sale_price = $item->getBasePrice(); if ($regular_price - $sale_price > 0.005) { $qty = $item->getQtyOrdered(); $total_sale_discount = ($regular_price * $qty) - ($sale_price * $qty); $item->setFullRetailPrice((string)$regular_price); $item->setSaleDiscount((string)$total_sale_discount); } } } } private function _lookupFullRetail(&$item,$store_id) { $mpid = $item->getProductId(); $p = Mage::getModel('catalog/product')->setStoreId($store_id)->load($mpid); return $p->getPrice(); } } 

В вашем модуле etc/config.xml необходимо указать magento, когда вы запустите своего наблюдателя:

 <?xml version="1.0"?> <config> <global> <models> <yourco_salepricing> <class>YourCo_SalePricing_Model</class> </yourco_salepricing> </models> <events> <sales_order_load_after> <observers> <yourco_salepricing> <type>singleton</type> <class>YourCo_SalePricing_Model_Promo_Observer</class> <method>report_sale_pricing</method> </yourco_salepricing> </observers> </sales_order_load_after> </events> </global> </config> 

Обязательно активируйте свой новый модуль в app/etc/modules/... и очистите кеш конфигурации.

Теперь, когда вы загружаете заказ, вы можете перебирать каждый элемент и проверять $item->getFullRetailPrice() -- если он есть, вы знаете, что товар продавался (ну, либо это, либо цена выросла с тех пор, как заказ был размещен). Вы все еще не знаете, почему, т.е. какое правило цены продажи было в силе, но для нашего приложения нам все равно, и получение этой информации, которая будет сохранена в заказе, была бы намного более жестким модом.

Что может вам помочь:

 $order = Mage::getModel('sales/order')->load(20569); echo Mage::helper('sales')->__('Discount (%s)', $order->getDiscountDescription()); 

Это печатает все имена правил скидок, которые были применены к заказу.