在Magento的先前版本(1.6及之前的CE,1.11及之前的EE)中,管理仪表板上的图表将反映所采用的总订单数。自1.7 / 1.12起,现在已经改变以反映已开票的订单。我们使用自定义状态,并将仪表板图表作为快速心跳类型的销售报告。但是,由于我们处理后端订单处理(不是通过Magento),我们的订单都没有达到发票状态
如何更改信息中心图表以报告订单的处理,已开票和我们的自定义状态?我们的自定义状态与Processing相关联,因此我可能只需要查询Processing和Invoiced。根据Magento支持,这种修改是可能的,但除了/app/design/Adminhtml/default/default/template/dashboard/graph.phtml文件之外,我不知道从哪里开始查看。谢谢!
答案 0 :(得分:3)
Oleg Ishenko的回答指出了你的方向,但不是很全面
1.在您创建的模块中,您需要覆盖Mage_Reports_Model_Resource_Order_Collection
:所以在config.xml
放置:
...
<global>
<models>
<yourmodule>
<class>Namespace_Yourmodule_Model</class>
</yourmodule>
<reports_resource>
<rewrite>
<order_collection>Namespace_Yourmodule_Model_Reports_Resource_Order_Collection</order_collection>
</rewrite>
</reports_resource>
</models>
</global>
...
2.然后创建类(尊重路径),在这个类中你需要覆盖2个方法:
<?php
/**
* Show all orders, not only the invoiced one
*/
class Namespace_Yourmodule_Model_Reports_Resource_Order_Collection extends Mage_Reports_Model_Resource_Order_Collection
{
protected function _prepareSummaryLive($range, $customStart, $customEnd, $isFilter = 0)
{
$this->setMainTable('sales/order');
$adapter = $this->getConnection();
/**
* Reset all columns, because result will group only by 'created_at' field
*/
$this->getSelect()->reset(Zend_Db_Select::COLUMNS);
$expression = sprintf('%s - %s - %s - (%s - %s - %s)',
$adapter->getIfNullSql('main_table.base_total_invoiced', 0),
$adapter->getIfNullSql('main_table.base_tax_invoiced', 0),
$adapter->getIfNullSql('main_table.base_shipping_invoiced', 0),
$adapter->getIfNullSql('main_table.base_total_refunded', 0),
$adapter->getIfNullSql('main_table.base_tax_refunded', 0),
$adapter->getIfNullSql('main_table.base_shipping_refunded', 0)
);
if ($isFilter == 0) {
$this->getSelect()->columns(array(
'revenue' => new Zend_Db_Expr(
sprintf('SUM((%s) * %s)', $expression,
$adapter->getIfNullSql('main_table.base_to_global_rate', 0)
)
)
));
} else {
$this->getSelect()->columns(array(
'revenue' => new Zend_Db_Expr(sprintf('SUM(%s)', $expression))
));
}
$dateRange = $this->getDateRange($range, $customStart, $customEnd);
$tzRangeOffsetExpression = $this->_getTZRangeOffsetExpression(
$range, 'created_at', $dateRange['from'], $dateRange['to']
);
$this->getSelect()
->columns(array(
'quantity' => 'COUNT(main_table.entity_id)',
'range' => $tzRangeOffsetExpression,
))
//BOF modification
// ->where('main_table.state NOT IN (?)', array(
// Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
// Mage_Sales_Model_Order::STATE_NEW)
// )
//EOF modification
->order('range', Zend_Db_Select::SQL_ASC)
->group($tzRangeOffsetExpression);
$this->addFieldToFilter('created_at', $dateRange);
return $this;
}
protected function _calculateTotalsLive($isFilter = 0)
{
$this->setMainTable('sales/order');
$this->removeAllFieldsFromSelect();
$adapter = $this->getConnection();
$baseTotalInvoiced = $adapter->getIfNullSql('main_table.base_grand_total', 0);
$baseTotalRefunded = $adapter->getIfNullSql('main_table.base_discount_refunded', 0);
$baseTaxInvoiced = $adapter->getIfNullSql('main_table.base_tax_amount', 0);
$baseTaxRefunded = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);
$baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_amount', 0);
$baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);
$revenueExp = sprintf('%s - %s - %s - (%s - %s - %s)',
$baseTotalInvoiced,
$baseTaxInvoiced,
$baseShippingInvoiced,
$baseTotalRefunded,
$baseTaxRefunded,
$baseShippingRefunded
);
$taxExp = sprintf('%s - %s', $baseTaxInvoiced, $baseTaxRefunded);
$shippingExp = sprintf('%s - %s', $baseShippingInvoiced, $baseShippingRefunded);
if ($isFilter == 0) {
$rateExp = $adapter->getIfNullSql('main_table.base_to_global_rate', 0);
$this->getSelect()->columns(
array(
'revenue' => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $revenueExp, $rateExp)),
'tax' => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $taxExp, $rateExp)),
'shipping' => new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $shippingExp, $rateExp))
)
);
} else {
$this->getSelect()->columns(
array(
'revenue' => new Zend_Db_Expr(sprintf('SUM(%s)', $revenueExp)),
'tax' => new Zend_Db_Expr(sprintf('SUM(%s)', $taxExp)),
'shipping' => new Zend_Db_Expr(sprintf('SUM(%s)', $shippingExp))
)
);
}
$this->getSelect()->columns(array(
'quantity' => 'COUNT(main_table.entity_id)'
));
//BOF modification
// ->where('main_table.state NOT IN (?)', array(
// Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
// Mage_Sales_Model_Order::STATE_NEW)
// );
//EOF modification
return $this;
}
}
在这个例子中,我按照订单的状态对过滤进行了注释,但您可以轻松地将其取消,并将您不希望计入的订单状态放入其中。
HTH
答案 1 :(得分:1)
我做了一些挖掘,看起来这个集合是在Mage_Reports_Model_Resource_Order_Collection::_prepareSummaryLive()
中构建的。在Magento 1.7.0.2中,限制基于订单,而订单不是stati Mage_Sales_Model_Order::STATE_PENDING_PAYMENT
或Mage_Sales_Model_Order::STATE_NEW
。
无论如何,可以在这里操作集合过滤器 (还see the class file on github):
$this->getSelect()
->columns(array(
'quantity' => 'COUNT(main_table.entity_id)',
'range' => $tzRangeOffsetExpression,
))
->where('main_table.state NOT IN (?)', array(
Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
Mage_Sales_Model_Order::STATE_NEW)
)
->order('range', Zend_Db_Select::SQL_ASC)
->group($tzRangeOffsetExpression);
当然,任何提议的操作都是类重写:)
答案 2 :(得分:0)
我找到了一个建议的解决方案但是没有取得太大成功。如果其他人可以验证这是一个可能的解决方案,我将修改这个答案反映如此。我还将更改答案以正确应用更改而无需修改核心文件。
<小时/> 打开/app/code/core/Mage/Adminhtml/Block/Dashboard/Orders/Grid.php并添加
$collection->addAttributeToFilter('state', Mage_Sales_Model_Order::STATE_PROCESSING);
AFTER
$collection = Mage::getResourceModel('reports/order_collection')
->addItemCountExpr()
->joinCustomerName('customer')
->orderByCreatedAt();