PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/app/code/core/Mage/Sales/Model/Resource/Report/Refunded.php

https://bitbucket.org/acidel/buykoala
PHP | 277 lines | 181 code | 37 blank | 59 comment | 10 complexity | 731496910a92039a24cb182dc07b8585 MD5 | raw file
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magentocommerce.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magentocommerce.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Sales
  23. * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Refund report resource model
  28. *
  29. * @category Mage
  30. * @package Mage_Sales
  31. * @author Magento Core Team <core@magentocommerce.com>
  32. */
  33. class Mage_Sales_Model_Resource_Report_Refunded extends Mage_Sales_Model_Resource_Report_Abstract
  34. {
  35. /**
  36. * Model initialization
  37. *
  38. */
  39. protected function _construct()
  40. {
  41. $this->_setResource('sales');
  42. }
  43. /**
  44. * Aggregate Refunded data
  45. *
  46. * @param mixed $from
  47. * @param mixed $to
  48. * @return Mage_Sales_Model_Resource_Report_Refunded
  49. */
  50. public function aggregate($from = null, $to = null)
  51. {
  52. // convert input dates to UTC to be comparable with DATETIME fields in DB
  53. $from = $this->_dateToUtc($from);
  54. $to = $this->_dateToUtc($to);
  55. $this->_checkDates($from, $to);
  56. $this->_aggregateByOrderCreatedAt($from, $to);
  57. $this->_aggregateByRefundCreatedAt($from, $to);
  58. $this->_setFlagData(Mage_Reports_Model_Flag::REPORT_REFUNDED_FLAG_CODE);
  59. return $this;
  60. }
  61. /**
  62. * Aggregate refunded data by order created at as period
  63. *
  64. * @param mixed $from
  65. * @param mixed $to
  66. * @return Mage_Sales_Model_Resource_Report_Refunded
  67. */
  68. protected function _aggregateByOrderCreatedAt($from, $to)
  69. {
  70. $table = $this->getTable('sales/refunded_aggregated_order');
  71. $sourceTable = $this->getTable('sales/order');
  72. $adapter = $this->_getWriteAdapter();
  73. $adapter->beginTransaction();
  74. try {
  75. if ($from !== null || $to !== null) {
  76. $subSelect = $this->_getTableDateRangeSelect($sourceTable, 'created_at', 'updated_at', $from, $to);
  77. } else {
  78. $subSelect = null;
  79. }
  80. $this->_clearTableByDateRange($table, $from, $to, $subSelect);
  81. // convert dates from UTC to current admin timezone
  82. $periodExpr = $adapter->getDatePartSql(
  83. $this->getStoreTZOffsetQuery($sourceTable, 'created_at', $from, $to)
  84. );
  85. $columns = array(
  86. 'period' => $periodExpr,
  87. 'store_id' => 'store_id',
  88. 'order_status' => 'status',
  89. 'orders_count' => new Zend_Db_Expr('COUNT(total_refunded)'),
  90. 'refunded' => new Zend_Db_Expr('SUM(base_total_refunded * base_to_global_rate)'),
  91. 'online_refunded' => new Zend_Db_Expr('SUM(base_total_online_refunded * base_to_global_rate)'),
  92. 'offline_refunded' => new Zend_Db_Expr('SUM(base_total_offline_refunded * base_to_global_rate)')
  93. );
  94. $select = $adapter->select();
  95. $select->from($sourceTable, $columns)
  96. ->where('state != ?', Mage_Sales_Model_Order::STATE_CANCELED)
  97. ->where('base_total_refunded > ?', 0);
  98. if ($subSelect !== null) {
  99. $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  100. }
  101. $select->group(array(
  102. $periodExpr,
  103. 'store_id',
  104. 'status'
  105. ));
  106. $select->having('orders_count > 0');
  107. $helper = Mage::getResourceHelper('core');
  108. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  109. $adapter->query($insertQuery);
  110. $select->reset();
  111. $columns = array(
  112. 'period' => 'period',
  113. 'store_id' => new Zend_Db_Expr('0'),
  114. 'order_status' => 'order_status',
  115. 'orders_count' => new Zend_Db_Expr('SUM(orders_count)'),
  116. 'refunded' => new Zend_Db_Expr('SUM(refunded)'),
  117. 'online_refunded' => new Zend_Db_Expr('SUM(online_refunded)'),
  118. 'offline_refunded' => new Zend_Db_Expr('SUM(offline_refunded)')
  119. );
  120. $select
  121. ->from($table, $columns)
  122. ->where('store_id != ?', 0);
  123. if ($subSelect !== null) {
  124. $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  125. }
  126. $select->group(array(
  127. 'period',
  128. 'order_status'
  129. ));
  130. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  131. $adapter->query($insertQuery);
  132. $adapter->commit();
  133. } catch (Exception $e) {
  134. $adapter->rollBack();
  135. throw $e;
  136. }
  137. return $this;
  138. }
  139. /**
  140. * Aggregate refunded data by creditmemo created at as period
  141. *
  142. * @param mixed $from
  143. * @param mixed $to
  144. * @return Mage_Sales_Model_Resource_Report_Refunded
  145. */
  146. protected function _aggregateByRefundCreatedAt($from, $to)
  147. {
  148. $table = $this->getTable('sales/refunded_aggregated');
  149. $sourceTable = $this->getTable('sales/creditmemo');
  150. $orderTable = $this->getTable('sales/order');
  151. $adapter = $this->_getWriteAdapter();
  152. $adapter->beginTransaction();
  153. try {
  154. if ($from !== null || $to !== null) {
  155. $subSelect = $this->_getTableDateRangeRelatedSelect(
  156. $sourceTable, $orderTable, array('order_id'=>'entity_id'),
  157. 'created_at', 'updated_at', $from, $to
  158. );
  159. } else {
  160. $subSelect = null;
  161. }
  162. $this->_clearTableByDateRange($table, $from, $to, $subSelect);
  163. // convert dates from UTC to current admin timezone
  164. $periodExpr = $adapter->getDatePartSql(
  165. $this->getStoreTZOffsetQuery(
  166. array('source_table' => $sourceTable),
  167. 'source_table.created_at', $from, $to
  168. )
  169. );
  170. $columns = array(
  171. 'period' => $periodExpr,
  172. 'store_id' => 'order_table.store_id',
  173. 'order_status' => 'order_table.status',
  174. 'orders_count' => new Zend_Db_Expr('COUNT(order_table.entity_id)'),
  175. 'refunded' => new Zend_Db_Expr(
  176. 'SUM(order_table.base_total_refunded * order_table.base_to_global_rate)'),
  177. 'online_refunded' => new Zend_Db_Expr(
  178. 'SUM(order_table.base_total_online_refunded * order_table.base_to_global_rate)'),
  179. 'offline_refunded' => new Zend_Db_Expr(
  180. 'SUM(order_table.base_total_offline_refunded * order_table.base_to_global_rate)')
  181. );
  182. $select = $adapter->select();
  183. $select->from(array('source_table' => $sourceTable), $columns)
  184. ->joinInner(
  185. array('order_table' => $orderTable),
  186. 'source_table.order_id = order_table.entity_id AND '
  187. . $adapter->quoteInto('order_table.state != ?', Mage_Sales_Model_Order::STATE_CANCELED)
  188. . ' AND order_table.base_total_refunded > 0',
  189. array()
  190. );
  191. $filterSubSelect = $adapter->select();
  192. $filterSubSelect
  193. ->from(
  194. array('filter_source_table' => $sourceTable),
  195. new Zend_Db_Expr('MAX(filter_source_table.entity_id)'))
  196. ->where('filter_source_table.order_id = source_table.order_id');
  197. if ($subSelect !== null) {
  198. $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  199. }
  200. $select->where('source_table.entity_id = (?)', new Zend_Db_Expr($filterSubSelect));
  201. unset($filterSubSelect);
  202. $select->group(array(
  203. $periodExpr,
  204. 'order_table.store_id',
  205. 'order_table.status'
  206. ));
  207. $select->having('orders_count > 0');
  208. $helper = Mage::getResourceHelper('core');
  209. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  210. $adapter->query($insertQuery);
  211. $select->reset();
  212. $columns = array(
  213. 'period' => 'period',
  214. 'store_id' => new Zend_Db_Expr('0'),
  215. 'order_status' => 'order_status',
  216. 'orders_count' => new Zend_Db_Expr('SUM(orders_count)'),
  217. 'refunded' => new Zend_Db_Expr('SUM(refunded)'),
  218. 'online_refunded' => new Zend_Db_Expr('SUM(online_refunded)'),
  219. 'offline_refunded' => new Zend_Db_Expr('SUM(offline_refunded)')
  220. );
  221. $select
  222. ->from($table, $columns)
  223. ->where('store_id != ?', 0);
  224. if ($subSelect !== null) {
  225. $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  226. }
  227. $select->group(array(
  228. 'period',
  229. 'order_status'
  230. ));
  231. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  232. $adapter->query($insertQuery);
  233. } catch (Exception $e) {
  234. $adapter->rollBack();
  235. throw $e;
  236. }
  237. $adapter->commit();
  238. return $this;
  239. }
  240. }