我目前正在实施一个插件来管理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()
对行总数和引用的小计都没有影响。
是否有任何文档或示例如何添加销售规则(在我看来更好,因为它是可追踪的)或手动折扣,以编程方式添加到报价项目和/或报价本身。
提前感谢您和最好的问候!
勒夫
答案 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的默认折扣系统并排运行,也不会影响税收计算等。
希望,这有助于有人在解决同样的问题。