2011-10-04 6 views
5

katalog ve alışveriş sepeti fiyatlarının siparişten nasıl alınabileceğini bilen var mı?Magento - siparişten fiyat kuralları alın

getDiscountPercent() yöntemiyle bir sipariş öğesinden indirim yüzdesini alabildiğimi biliyorum, ancak tüm siparişe uygulanan tüm kuralları nasıl alabilirim? Örneğin, "Müşteri Grubu X, mağazadaki tüm öğeleri% 20 indirimli alır" kuralım var.

Şimdi, sipariş kullanıcı tarafından gönderildiğinde hangi kuralların gerçekte uygulandığını belirlemek istiyorum. Kullanıcının aldığı tüm indirimleri sağlaması gereken bir sipariş verme arabirimi için buna ihtiyacım var.

Şimdiden teşekkürler!

+2

Katalog fiyatlarının hiçbir şekilde sipariş üzerine uygulanmasını sağlayamıyorsunuz. Bu kurallar fiyat endeksleyici tarafından kataloga uygulanır. Alıntı bu endekslenmiş fiyatı ürün fiyatı olarak alır. – Zyava

cevap

4

sales_flat_order_item tablosuna bakın. applied_rule_ids adında bir alan vardır, bu da bu öğeye uygulanan kuralın kimliğini size verecektir. Ayrıca bu tabloda ne kadar indirim uygulandığını ve yüzdesini öğrenebilirsiniz.

Örnek

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

Teşekkürler, bu çalışır, ancak getAppliedRuleIds() ile yalnızca sepet kural kimliklerini (örneğin bir kupon kodu kuralı) alırım, ancak katalog kurallarını değil? – Alex

+0

'getAppliedRuleIds()' size alışveriş sepeti fiyat kurallarının virgülle ayrılmış bir listesini alacaktır, böylece ismini alabilmek için 'salesrule/rule 'modelini yüklemelisiniz. Öyle: '$ kural = 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

Bu soruya cevap vermiyor. – Karl

2

Evet, o taban fiyat hesaplanması ile ilgili olarak satış fiyatlandırma kullandığınızda Magento sipariş kaydında etrafında herhangi geçmişini bırakmaz tür bir ağrı var.

Neyse ki açık kaynak kodludur, bu nedenle isterseniz bunu yamalayabilirsiniz.

Geçenlerde, sipariş kaydı yüklendiğinde, bu sorunu çözmek için ateşleyen bir gözlemci yazdım. Ürünün mevcut perakende satış fiyatı ile base_price hattını çapraz referanslar. Bir uyumsuzluk varsa, bu bilgiyi dinleyen herhangi bir harici komut dosyasına (bu durumda, siparişleri Magento'nun SOAP API'sini kullanarak SAP'ye geçiren özel bir sipariş yerine getirme betiği) göstermeye yardımcı olmak için sipariş öğesine bir çift alan ekler.

<?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/code/local/YourCo/SalePricing

bir modül yapmak ve gözlemci ne zaman çalıştırılacağını magento anlatmak için 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(); 
    } 

} 

Kişisel modülün etc/config.xml ihtiyaçlarını gözlemci sınıfını ayarlamak -

İşte temel fikir

Yeni modülünüzü app/etc/modules/... içinde etkinleştirdiğinizden emin olun ve yapılandırma önbelleğini temizleyin. e.

Şimdi, siparişi yüklediğinizde, her bir öğenin üstesinden gelebilir ve eğer varsa $item->getFullRetailPrice() -- için kontrol edebilirsiniz, öğenin satışta olduğunu biliyorsunuz (siparişin verilişinden bu yana ya da fiyat yükseldi) . Hala nedenini, yani hangi satış fiyatı kuralının geçerli olduğunu bilmiyorsunuz, fakat bizim uygulamamız için gerçekten önemsemedik ve bu bilgiyi siparişle birlikte saklamak çok daha zor bir mod olurdu. gerçi size yardımcı olabilir ne

1

:

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

Bu siparişe uygulanmış olan tüm indirim kuralları adını yazdırır.