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