問題描述
我正在關注這篇文章 更改 Magento 1.7/1.12 版本中的儀表盤圖表 以允許處理"訂單的銷售顯示在儀表盤圖表上.我的文件位于正確的目錄下方和內,并且在 config>advanced 中顯示為活動狀態.我還重新索引、刷新了緩存和刷新了生命周期統計信息.我在日志中沒有看到任何錯誤.你能看出有什么問題嗎?我有 firegento 并啟用了日志記錄,但這也不起作用.
儀表板上的收入總額似乎是正確的,但它沒有反映在時間線圖上.例如,上午 10 點可能有 30 個條款的凈訂單 2000 美元,但它沒有顯示在時間圖上.誰可以修復下面的腳本以反映我的時間表,則懸賞賞金!
CaitlinHavener/Dashboard/etc/config.xml:
<配置><模塊><CaitlinHavener_Dashboard><version>1.0</version></CaitlinHavener_Dashboard></模塊><全球><模型><CaitlinHavener_Dashboard><class>CaitlinHavener_Dashboard_Model</class></CaitlinHavener_Dashboard><reports_resource><重寫><order_collection>CaitlinHavener_Dashboard_Model_Reports_Resource_Order_Collection</order_collection></rewrite></reports_resource></模型></全球></config>
CaitlinHavener/Dashboard/Model/Reports/Resource/Order/Collection.php
setMainTable('銷售/訂單');$adapter = $this->getConnection();/*** 重置所有列,因為結果將僅按 'created_at' 字段分組*/$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));*/$expression = sprintf('%s - %s - %s - (%s - %s - %s)',$adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total'),$adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount'),$adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount'),$adapter->getIfNullSql('main_table.base_total_refunded', 0),$adapter->getIfNullSql('main_table.base_tax_refunded', 0),$adapter->getIfNullSql('main_table.base_shipping_refunded', 0));如果($isFilter == 0){$this->getSelect()->columns(array()'收入' =>新 Zend_Db_Expr(sprintf('SUM((%s) * %s)', $表達式,$adapter->getIfNullSql('main_table.base_to_global_rate', 0)))));} 別的 {$this->getSelect()->columns(array()'收入' =>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()-> 列(數組('數量' =>'COUNT(main_table.entity_id)','范圍' =>$tzRangeOffsetExpression,))//轉爐修改->where('main_table.state NOT IN (?)', array(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,//Mage_Sales_Model_Order::STATE_NEW))//EOF修改-> order('range', Zend_Db_Select::SQL_ASC)-> 組($tzRangeOffsetExpression);$this->addFieldToFilter('created_at', $dateRange);返回 $this;}受保護的函數 _calculateTotalsLive($isFilter = 0){$this->setMainTable('銷售/訂單');$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);//$baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);$baseTotalInvoiced = $adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total');//這將檢查是否沒有發票,它將根據總計計算(因此當您生成和發票時,您也不會遇到數字問題)$baseTotalRefunded = $adapter->getIfNullSql('main_table.base_total_refunded', 0);$baseTaxInvoiced = $adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount');//稅收也一樣$baseTaxRefunded = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);$baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount');//與這里相同的運輸$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);如果($isFilter == 0){$rateExp = $adapter->getIfNullSql('main_table.base_to_global_rate', 0);$this->getSelect()->columns(大批('收入' =>new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $revenueExp, $rateExp)),'稅' =>new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $taxExp, $rateExp)),'運輸' =>new Zend_Db_Expr(sprintf('SUM((%s) * %s)', $shippingExp, $rateExp))));} 別的 {$this->getSelect()->columns(大批('收入' =>new Zend_Db_Expr(sprintf('SUM(%s)', $revenueExp)),'稅' =>new Zend_Db_Expr(sprintf('SUM(%s)', $taxExp)),'運輸' =>new Zend_Db_Expr(sprintf('SUM(%s)', $shippingExp))));}$this->getSelect()->columns(array()'數量' =>'COUNT(main_table.entity_id)'))->where('main_table.state NOT IN (?)', array(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,//Mage_Sales_Model_Order::STATE_NEW));返回 $this;}}?>
您必須了解 Magento 中的 Order 流程??,才能完全了解圖表的填充方式
- 訂單作為新訂單(如后付款訂單 - 貨到付款,...)或待處理訂單(信用卡訂單或貝寶等.所有在線支付方式)進入商店.
- 可以在這一步取消訂單(因為沒有生成發票).
- 在線支付的情況下,支付成功(因此訂單已開具發票 - 發票已生成).
- 訂單在開具發票后發貨(生成發貨).
- 訂單已退款(部分或全部),因此生成貸項通知單.
現在,如果您查看前面的步驟,您將看到如果訂單處于 NEW 和 CANCELED STATE(不是狀態),則不應計算收入
應在訂單開具發票時計算(這樣您將獲得收入、運費和退款)
所以要統計收入和圖表中NEW STATE的訂單重寫方法
<塊引用>app/code/core/Mage/Reports/Model/Resource/Order/Collection.php/***計算總計實時報告** @param int $isFilter* @return Mage_Reports_Model_Resource_Order_Collection*/受保護的函數 _calculateTotalsLive($isFilter = 0){}
//第 430 行->where('main_table.state NOT IN (?)', array(Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,Mage_Sales_Model_Order::STATE_NEW//注釋此行));
所以現在如果你評論這一行,訂單將被計入(訂單圖表)
但是仍然沒有計算總數(因為沒有發票/發貨/退款)
因此,您需要將計算過程從使用發票金額更改為僅在發票之前使用 TOTALS 通過小的更改,您可以毫無錯誤地實現您想要的代碼下面的代碼
更改行(390 及以下為如下所示):
$baseTotalInvoiced = $adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total');//這將檢查是否沒有發票,它將根據總計計算(因此當您生成和發票時,您也不會遇到數字問題)$baseTotalRefunded = $adapter->getIfNullSql('main_table.base_total_refunded', 0);$baseTaxInvoiced = $adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount');//稅收也一樣$baseTaxRefunded = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);$baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount');//與這里相同的運輸$baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);
所以在簡單的答案中,解決方案沒有改變計算方式,但解決方案改變了計算的默認值
遵循此更改,您將得到您真正想要的:)
I am following along with this post Change the Dashboard Graph in version 1.7/1.12 of Magento to allow the sales of "processing" orders to show up on the dashboard graph. My files are below and within the right directories as well as showing up as active in config>advanced. I have also reindexed, refreshed cache, and refreshed lifetime statistics. I am seeing no errors in the logs. Can you see what is wrong? I have firegento and have enabled logging, but that's not working either.
EDIT: The Revenue total on the dashboard seems correct, but its not reflecting on the timeline graph. For example there may be a net 30 terms order of $2000 at 10AM but it doesn't show on the time graph. Bounty for whoever can fix the script below to reflect on the timeline for me!
CaitlinHavener/Dashboard/etc/config.xml:
<?xml version="1.0"?>
<config>
<modules>
<CaitlinHavener_Dashboard>
<version>1.0</version>
</CaitlinHavener_Dashboard>
</modules>
<global>
<models>
<CaitlinHavener_Dashboard>
<class>CaitlinHavener_Dashboard_Model</class>
</CaitlinHavener_Dashboard>
<reports_resource>
<rewrite>
<order_collection>CaitlinHavener_Dashboard_Model_Reports_Resource_Order_Collection</order_collection>
</rewrite>
</reports_resource>
</models>
</global>
</config>
CaitlinHavener/Dashboard/Model/Reports/Resource/Order/Collection.php
<?php
/**
* Show all orders, not only the invoiced one
*/
class CaitlinHavener_Dashboard_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)
); */
$expression = sprintf('%s - %s - %s - (%s - %s - %s)',
$adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total'),
$adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount'),
$adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount'),
$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);
// $baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);
$baseTotalInvoiced = $adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total'); // This will check if there is no invoice it will calculate based on the grand totals ( so when you generate and invoice u will have no issues with the numbers also )
$baseTotalRefunded = $adapter->getIfNullSql('main_table.base_total_refunded', 0);
$baseTaxInvoiced = $adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount'); // Same here for taxes
$baseTaxRefunded = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);
$baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount'); // Same here for shipping
$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)'
))
->where('main_table.state NOT IN (?)', array(
Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
//Mage_Sales_Model_Order::STATE_NEW
)
);
return $this;
}
}
?>
You have to understand the Order process in Magento so you can fully understand how the chart being populated
- Order come to the Store as new Order ( like post paid orders - Cash on Delivery, ... ) or Pending order ( credit card orders or paypal etc.. all online payment methods ).
- Order can be canceled at this step ( as no invoice generated ).
- In case of online payment, payment gone through successfully ( So the order is invoiced - invoice generated ).
- Order Shipped after being invoiced ( Shipment is generated ).
- Order refunded ( partial or complete ) so credit memos generated.
Now if you look at the previous steps and you will see that the Revenue not supposed to be calculated if the Order is in NEW and CANCELED STATE ( not status )
It should be calculated when the Order gets invoiced ( so you will get the revenue and shipping fees and the refunds )
So to count the orders in NEW STATE in the revenue and the graph Override the method
app/code/core/Mage/Reports/Model/Resource/Order/Collection.php /** * Calculate totals live report * * @param int $isFilter * @return Mage_Reports_Model_Resource_Order_Collection */ protected function _calculateTotalsLive($isFilter = 0){}
// Line 430
->where('main_table.state NOT IN (?)', array(
Mage_Sales_Model_Order::STATE_PENDING_PAYMENT,
Mage_Sales_Model_Order::STATE_NEW // Comment this line
)
);
So now if you comment this line the order Will be counted in the ( ORDERS chart graph )
but the totals is still not calculated ( because there is no invoice / shipments / refunds )
So you need to change the calculation process from using the invoiced amount to use the TOTALS only even before invoice With small changes you can achieve what you want without mistakes Code below
Change the lines ( 390 and below to be like the following ):
$baseTotalInvoiced = $adapter->getIfNullSql('main_table.base_total_invoiced', 'main_table.base_grand_total'); // This will check if there is no invoice it will calculate based on the grand totals ( so when you generate and invoice u will have no issues with the numbers also )
$baseTotalRefunded = $adapter->getIfNullSql('main_table.base_total_refunded', 0);
$baseTaxInvoiced = $adapter->getIfNullSql('main_table.base_tax_invoiced', 'main_table.base_tax_amount'); // Same here for taxes
$baseTaxRefunded = $adapter->getIfNullSql('main_table.base_tax_refunded', 0);
$baseShippingInvoiced = $adapter->getIfNullSql('main_table.base_shipping_invoiced', 'main_table.base_shipping_amount'); // Same here for shipping
$baseShippingRefunded = $adapter->getIfNullSql('main_table.base_shipping_refunded', 0);
So In simple answer the solution is not changed the Way of calculation, But the solution change the Default values of the calculations
Follow this changes and you will get what you exactly want :)
這篇關于Magento 模塊更改儀表板圖的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!