В предыдущих версиях Magento (1,6 и ранее для CE, 1.11 и ранее для EE) график на панели управления администратора отражал количество принятых принятых заказов. Начиная с 1.7 / 1.12, это теперь было изменено для отражения заказов, которые были выставлены на счет. Мы используем настраиваемые статусы и, как, например, график Dashboard как отчет о быстром сердечном ритме продаж. Тем не менее, ни один из наших заказов никогда не достигает статуса счета-фактуры из-за того, как мы обрабатываем обработку обратного конечного заказа (а не через Magento)
Как я могу изменить график панели мониторинга, чтобы сообщить об обработке, фактуре и нашем пользовательском статусе заказа? Наш пользовательский статус привязан к обработке, поэтому мне может потребоваться только запрос на обработку и выставление счетов. Согласно Magento Support, такая модификация возможна, но я не уверен, где начать искать, помимо файла /app/design/Adminhtml/default/default/template/dashboard/graph.phtml. Благодаря!
Ответ Олега Ищенко указывает на то, что вы в правильном направлении, но не совсем исчерпывающий.
1. В Mage_Reports_Model_Resource_Order_Collection
модуле вам необходимо переопределить Mage_Reports_Model_Resource_Order_Collection
: так что в вашем 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; } }
В этом примере я поместил фильтрацию по статусу заказа, но вы можете легко ее не использовать и поместить статусы заказов, которые вы не хотите учитывать.
НТН
Я сделал некоторые копания, и похоже, что коллекция строится в 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
.
Во всяком случае, здесь можно манипулировать фильтрами сбора (также см. Файл класса в 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);
Любые предлагаемые манипуляции, конечно же, являются переписываемыми классами 🙂
Я нашел одно предлагаемое решение, но у меня нет большого успеха в его применении. Если кто-то еще может проверить, что это возможное решение, я изменю этот ответ, отражающий это. Я также изменю ответ, чтобы правильно применить изменение без изменения основного файла.
Откройте /app/code/core/Mage/Adminhtml/Block/Dashboard/Orders/Grid.php и добавьте
$collection->addAttributeToFilter('state', Mage_Sales_Model_Order::STATE_PROCESSING);
ПОСЛЕ
$collection = Mage::getResourceModel('reports/order_collection') ->addItemCountExpr() ->joinCustomerName('customer') ->orderByCreatedAt();