如何以编程方式将magento销售规则应用于报价项目

时间:2011-05-10 04:26:11

标签: php magento

我目前正在实施一个插件来管理magento商店系统中的报价请求。我们的想法是,请求与报价相关联,后端的某个人应该能够为每个报价项应用单独的销售规则。

实现在前端和后端创建和编辑所涉及实体的功能没有问题。但我无法将某个销售规则应用于报价项目,并将该规则反映在行总计以及报价的小计中。

我目前的做法是使用sales_quote_address_discount_item - Hook。在那里,我使用了一个派生自Mage_SalesRule_Model_Validator的类的实例,该类重载了_getRules() - Method提供了相关的Mage_SalesRule_Model_Rule。事件观察者的相关代码如下:

$quote_item = $event->getItem();

$request_item = $this->helper->getRequestItemByQuoteItemId($quote_item->getItemId());
if (! $this->isRelevantRequestItem($request_item))
    return $this;

$validator = Mage::getModel("requestquotation/request_validator")
                 ->addRule($request_item->getRule());
$validator->process($quote_item);

当我通过process() - 方法调试器时,我提供的规则可以正常工作并应用于引用项。但是引号上的任何进一步的collectTotals()$quote_item->save()对行总数和引用的小计都没有影响。

是否有任何文档或示例如何添加销售规则(在我看来更好,因为它是可追踪的)或手动折扣,以编程方式添加到报价项目和/或报价本身。

提前感谢您和最好的问候!

勒夫

2 个答案:

答案 0 :(得分:19)

Chuck Norris是唯一拥有Magento文档的人。但是,在调用collectTotals()之前,你可以尝试将收集的标志设置为false:

$quote->setTotalsCollectedFlag(false)->collectTotals();

并且可选地,如果在同一个对象实例中多次调用collectTotals后你得到错误的总数,那么你需要注意以下问题:

http://www.magentocommerce.com/bug-tracking/issue?issue=11893

答案 1 :(得分:11)

不幸的是Chuck目前没有做咨询工作。所以我不得不深入研究纠缠的magento折扣计算。

totals_collected_flag重新计算是恕我直言,没有选项,因为它会触发两次税务计算,这意味着报价总数完全错误。

我通过实施新的Mage_Sales_Model_Quote_Address_Total_Abstract成功填充了我自己的折扣类型。这个是collect() - 方法的一种稍微定制的Mage_SalesRule_Model_Validator版本,它根据我的折扣策略加载自定义销售规则。

通过将以下XML添加到模块配置中,自定义类包含在Magento总计算中。

<global>
    ... 
    <sales>
        <quote>
           <totals>
               <requestquotation_discount>
                   <class>requestquotation/request_discount</class>
                   <after>discount</after>
                   <before>grand_total</before>
               </requestquotation_discount>
           </totals>
        </quote>
    </sales>
</global>

在实施中,总计算器的“代码”设置为“折扣”,并且不重置先前计算的折扣。使用这种方法,自定义折扣可以与Magento的默认折扣系统并排运行,也不会影响税收计算等。

希望,这有助于有人在解决同样的问题。