PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://github.com/rgranadino/magento-mirror
PHP | 296 lines | 197 code | 39 blank | 60 comment | 10 complexity | 9577b1579fa7995d121ed19cdebd7c37 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. * Invoice 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_Invoiced 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 Invoiced data
  45. *
  46. * @param mixed $from
  47. * @param mixed $to
  48. * @return Mage_Sales_Model_Resource_Report_Invoiced
  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->_aggregateByInvoiceCreatedAt($from, $to);
  58. $this->_setFlagData(Mage_Reports_Model_Flag::REPORT_INVOICE_FLAG_CODE);
  59. return $this;
  60. }
  61. /**
  62. * Aggregate Invoiced data by invoice created_at as period
  63. *
  64. * @param mixed $from
  65. * @param mixed $to
  66. * @return Mage_Sales_Model_Resource_Report_Invoiced
  67. */
  68. protected function _aggregateByInvoiceCreatedAt($from, $to)
  69. {
  70. $table = $this->getTable('sales/invoiced_aggregated');
  71. $sourceTable = $this->getTable('sales/invoice');
  72. $orderTable = $this->getTable('sales/order');
  73. $helper = Mage::getResourceHelper('core');
  74. $adapter = $this->_getWriteAdapter();
  75. $adapter->beginTransaction();
  76. try {
  77. if ($from !== null || $to !== null) {
  78. $subSelect = $this->_getTableDateRangeRelatedSelect(
  79. $sourceTable, $orderTable, array('order_id'=>'entity_id'),
  80. 'created_at', 'updated_at', $from, $to
  81. );
  82. } else {
  83. $subSelect = null;
  84. }
  85. $this->_clearTableByDateRange($table, $from, $to, $subSelect);
  86. // convert dates from UTC to current admin timezone
  87. $periodExpr = $adapter->getDatePartSql(
  88. $this->getStoreTZOffsetQuery(
  89. array('source_table' => $sourceTable),
  90. 'source_table.created_at', $from, $to
  91. )
  92. );
  93. $columns = array(
  94. // convert dates from UTC to current admin timezone
  95. 'period' => $periodExpr,
  96. 'store_id' => 'order_table.store_id',
  97. 'order_status' => 'order_table.status',
  98. 'orders_count' => new Zend_Db_expr('COUNT(order_table.entity_id)'),
  99. 'orders_invoiced' => new Zend_Db_expr('COUNT(order_table.entity_id)'),
  100. 'invoiced' => new Zend_Db_expr('SUM(order_table.base_total_invoiced'
  101. . ' * order_table.base_to_global_rate)'),
  102. 'invoiced_captured' => new Zend_Db_expr('SUM(order_table.base_total_paid'
  103. . ' * order_table.base_to_global_rate)'),
  104. 'invoiced_not_captured' => new Zend_Db_expr(
  105. 'SUM((order_table.base_total_invoiced - order_table.base_total_paid)'
  106. . ' * order_table.base_to_global_rate)')
  107. );
  108. $select = $adapter->select();
  109. $select->from(array('source_table' => $sourceTable), $columns)
  110. ->joinInner(
  111. array('order_table' => $orderTable),
  112. $adapter->quoteInto(
  113. 'source_table.order_id = order_table.entity_id AND order_table.state <> ?',
  114. Mage_Sales_Model_Order::STATE_CANCELED),
  115. array()
  116. );
  117. $filterSubSelect = $adapter->select();
  118. $filterSubSelect->from(array('filter_source_table' => $sourceTable), 'MAX(filter_source_table.entity_id)')
  119. ->where('filter_source_table.order_id = source_table.order_id');
  120. if ($subSelect !== null) {
  121. $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  122. }
  123. $select->where('source_table.entity_id = (?)', new Zend_Db_Expr($filterSubSelect));
  124. unset($filterSubSelect);
  125. $select->group(array(
  126. $periodExpr,
  127. 'order_table.store_id',
  128. 'order_table.status'
  129. ));
  130. $select->having('orders_count > 0');
  131. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  132. $adapter->query($insertQuery);
  133. $select->reset();
  134. $columns = array(
  135. 'period' => 'period',
  136. 'store_id' => new Zend_Db_Expr(Mage_Core_Model_App::ADMIN_STORE_ID),
  137. 'order_status' => 'order_status',
  138. 'orders_count' => new Zend_Db_expr('SUM(orders_count)'),
  139. 'orders_invoiced' => new Zend_Db_expr('SUM(orders_invoiced)'),
  140. 'invoiced' => new Zend_Db_expr('SUM(invoiced)'),
  141. 'invoiced_captured' => new Zend_Db_expr('SUM(invoiced_captured)'),
  142. 'invoiced_not_captured' => new Zend_Db_expr('SUM(invoiced_not_captured)')
  143. );
  144. $select
  145. ->from($table, $columns)
  146. ->where('store_id <> ?', 0);
  147. if ($subSelect !== null) {
  148. $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  149. }
  150. $select->group(array(
  151. 'period',
  152. 'order_status'
  153. ));
  154. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  155. $adapter->query($insertQuery);
  156. $adapter->commit();
  157. } catch (Exception $e) {
  158. $adapter->rollBack();
  159. throw $e;
  160. }
  161. return $this;
  162. }
  163. /**
  164. * Aggregate Invoiced data by order created_at as period
  165. *
  166. * @param mixed $from
  167. * @param mixed $to
  168. * @return Mage_Sales_Model_Resource_Report_Invoiced
  169. */
  170. protected function _aggregateByOrderCreatedAt($from, $to)
  171. {
  172. $table = $this->getTable('sales/invoiced_aggregated_order');
  173. $sourceTable = $this->getTable('sales/order');
  174. $adapter = $this->_getWriteAdapter();
  175. if ($from !== null || $to !== null) {
  176. $subSelect = $this->_getTableDateRangeSelect($sourceTable, 'created_at', 'updated_at', $from, $to);
  177. } else {
  178. $subSelect = null;
  179. }
  180. $this->_clearTableByDateRange($table, $from, $to, $subSelect);
  181. // convert dates from UTC to current admin timezone
  182. $periodExpr = $adapter->getDatePartSql(
  183. $this->getStoreTZOffsetQuery(
  184. $sourceTable, 'created_at', $from, $to
  185. )
  186. );
  187. $columns = array(
  188. 'period' => $periodExpr,
  189. 'store_id' => 'store_id',
  190. 'order_status' => 'status',
  191. 'orders_count' => new Zend_Db_Expr('COUNT(base_total_invoiced)'),
  192. 'orders_invoiced' => new Zend_Db_Expr(
  193. sprintf('SUM(%s)',
  194. $adapter->getCheckSql('base_total_invoiced > 0', 1, 0)
  195. )
  196. ),
  197. 'invoiced' => new Zend_Db_Expr(
  198. sprintf('SUM(%s * %s)',
  199. $adapter->getIfNullSql('base_total_invoiced',0),
  200. $adapter->getIfNullSql('base_to_global_rate',0)
  201. )
  202. ),
  203. 'invoiced_captured' => new Zend_Db_Expr(
  204. sprintf('SUM(%s * %s)',
  205. $adapter->getIfNullSql('base_total_paid',0),
  206. $adapter->getIfNullSql('base_to_global_rate',0)
  207. )
  208. ),
  209. 'invoiced_not_captured' => new Zend_Db_Expr(
  210. sprintf('SUM((%s - %s) * %s)',
  211. $adapter->getIfNullSql('base_total_invoiced',0),
  212. $adapter->getIfNullSql('base_total_paid',0),
  213. $adapter->getIfNullSql('base_to_global_rate',0)
  214. )
  215. )
  216. );
  217. $select = $adapter->select();
  218. $select->from($sourceTable, $columns)
  219. ->where('state <> ?', Mage_Sales_Model_Order::STATE_CANCELED);
  220. if ($subSelect !== null) {
  221. $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  222. }
  223. $select->group(array(
  224. $periodExpr,
  225. 'store_id',
  226. 'status'
  227. ));
  228. $select->having('orders_count > 0');
  229. $helper = Mage::getResourceHelper('core');
  230. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  231. $adapter->query($insertQuery);
  232. $select->reset();
  233. $columns = array(
  234. 'period' => 'period',
  235. 'store_id' => new Zend_Db_Expr(Mage_Core_Model_App::ADMIN_STORE_ID),
  236. 'order_status' => 'order_status',
  237. 'orders_count' => new Zend_Db_expr('SUM(orders_count)'),
  238. 'orders_invoiced' => new Zend_Db_expr('SUM(orders_invoiced)'),
  239. 'invoiced' => new Zend_Db_expr('SUM(invoiced)'),
  240. 'invoiced_captured' => new Zend_Db_expr('SUM(invoiced_captured)'),
  241. 'invoiced_not_captured' => new Zend_Db_expr('SUM(invoiced_not_captured)')
  242. );
  243. $select->from($table, $columns)
  244. ->where('store_id <> ?', 0);
  245. if ($subSelect !== null) {
  246. $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
  247. }
  248. $select->group(array(
  249. 'period',
  250. 'order_status'
  251. ));
  252. $helper = Mage::getResourceHelper('core');
  253. $insertQuery = $helper->getInsertFromSelectUsingAnalytic($select, $table, array_keys($columns));
  254. $adapter->query($insertQuery);
  255. return $this;
  256. }
  257. }