Magento - получить ценовые правила из заказа - PullRequest
6 голосов
/ 04 октября 2011

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 05 октября 2011

Посмотрите в таблицу 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>";
        }

    }
4 голосов
/ 08 ноября 2011
/* 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);
2 голосов
/ 15 мая 2012

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

1 голос
/ 05 мая 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...