2011-10-04 41 views
5

¿Alguien sabe cómo se pueden obtener las reglas de precio del catálogo y el carrito de un pedido?Magento: obtenga las reglas de precios a partir del pedido

Sé que puedo obtener el porcentaje de descuento de un artículo de pedido mediante el método getDiscountPercent(), pero ¿cómo puedo obtener todas las reglas que se aplicaron para todo el pedido?

Por ejemplo, tengo una regla "El Grupo de clientes X obtiene un 20% de descuento en todos los artículos en la tienda".

Ahora quiero determinar qué reglas se aplicaron realmente cuando el pedido fue enviado por el usuario. Necesito esto para una interfaz de exportación de pedidos donde tengo que proporcionar todos los descuentos que obtuvo el usuario.

¡Gracias de antemano!

+2

No se pueden obtener precios de catálogo aplicados para ordenar en absoluto. Estas reglas se aplican al catálogo por indexador de precios. La cotización recibe este precio indexado como precio del producto. – Zyava

Respuesta

4

Eche un vistazo a la tabla sales_flat_order_item. hay un campo llamado applied_rule_ids que le dará la identificación de la regla aplicada a ese artículo. También puede averiguar en esta tabla cuánto descuento se aplicó y el porcentaje.

Ejemplo

//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

Gracias, esto funciona, pero con getAppliedRuleIds() solo obtengo los ID de la regla del carro (por ejemplo, una regla de código de cupón), pero no las reglas del catálogo? – Alex

+0

'getAppliedRuleIds()' obtendrá una lista separada por comas de las reglas de precios del carrito de compras, por lo que para obtener su nombre debe cargar el modelo 'salesrule/rule'. Como tal: '$ rule = Mage :: getModel ('salesrule/rule') -> load ($ ruleID);' –

4
/* 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); 
+0

Esto no responde la pregunta. – Karl

2

Sí, es un tipo de dolor que Magento no deja ninguna historia alrededor en el registro de la orden cuando se utiliza la venta de precios con respecto a cómo se ha calculado que el precio base.

Afortunadamente es de código abierto, por lo que puede parchearlo si lo desea.

Hace poco escribí un observador que se dispara cuando se carga el registro de la orden, para solucionar este problema. Hace referencia cruzada a la línea base_price con el precio de venta total actual del producto. Si hay una discrepancia, agrega un par de campos al elemento de pedido para ayudar a exponer esta información a cualquier script externo que esté escuchando (en nuestro caso, un script de cumplimiento de pedidos personalizado que retransmite pedidos a SAP utilizando la API SOAP de Magento).

Ésta es la idea básica - hacer un módulo en app/code/local/YourCo/SalePricing

y configurar una clase de observador en 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 las necesidades de su módulo de decir Magento cuándo ejecutar el observador:

<?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> 

Asegúrese de activar su nuevo módulo en app/etc/modules/... y borre la configuración cach mi.

Ahora, cuando cargue el pedido, puede recorrer cada artículo y verificar $item->getFullRetailPrice() -- si está allí, usted sabe que el artículo estaba a la venta (bueno, o eso o el precio ha subido desde que se realizó el pedido) . Todavía no sabes por qué, es decir, qué regla de precio de venta estaba en vigencia, pero para nuestra aplicación realmente no nos importaba, y conseguir esa información para guardarla con la orden hubiera sido una modificación mucho más dura.

1

Lo que podría ayudarle sin embargo:

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

Esto muestra todo el nombre de reglas de descuento que se han aplicado a la orden.

Cuestiones relacionadas