Createdat.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SalesRule\Model\ResourceModel\Report\Rule;
  7. /**
  8. * Rule report resource model with aggregation by created at
  9. *
  10. * @author Magento Core Team <core@magentocommerce.com>
  11. */
  12. class Createdat extends \Magento\Reports\Model\ResourceModel\Report\AbstractReport
  13. {
  14. /**
  15. * Resource Report Rule constructor
  16. *
  17. * @return void
  18. */
  19. protected function _construct()
  20. {
  21. $this->_init('salesrule_coupon_aggregated', 'id');
  22. }
  23. /**
  24. * Aggregate Coupons data by order created at
  25. *
  26. * @param mixed|null $from
  27. * @param mixed|null $to
  28. * @return $this
  29. */
  30. public function aggregate($from = null, $to = null)
  31. {
  32. return $this->_aggregateByOrder('created_at', $from, $to);
  33. }
  34. /**
  35. * Aggregate coupons reports by orders
  36. *
  37. * @throws \Exception
  38. * @param string $aggregationField
  39. * @param mixed $from
  40. * @param mixed $to
  41. * @return $this
  42. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  43. */
  44. protected function _aggregateByOrder($aggregationField, $from, $to)
  45. {
  46. $table = $this->getMainTable();
  47. $sourceTable = $this->getTable('sales_order');
  48. $connection = $this->getConnection();
  49. $salesAdapter = $this->_resources->getConnection('sales');
  50. $connection->beginTransaction();
  51. try {
  52. if ($from !== null || $to !== null) {
  53. $subSelect = $this->_getTableDateRangeSelect($sourceTable, 'created_at', 'updated_at', $from, $to);
  54. } else {
  55. $subSelect = null;
  56. }
  57. $this->_clearTableByDateRange($table, $from, $to, $subSelect, false, $salesAdapter);
  58. // convert dates to current admin timezone
  59. $periodExpr = $connection->getDatePartSql(
  60. $this->getStoreTZOffsetQuery($sourceTable, $aggregationField, $from, $to, null, $salesAdapter)
  61. );
  62. $columns = [
  63. 'period' => $periodExpr,
  64. 'store_id' => 'store_id',
  65. 'order_status' => 'status',
  66. 'coupon_code' => 'coupon_code',
  67. 'rule_name' => 'coupon_rule_name',
  68. 'coupon_uses' => 'COUNT(entity_id)',
  69. 'subtotal_amount' => $connection->getIfNullSql(
  70. 'SUM((base_subtotal - ' . $connection->getIfNullSql(
  71. 'base_subtotal_canceled',
  72. 0
  73. ) . ') * base_to_global_rate)',
  74. 0
  75. ),
  76. 'discount_amount' => $connection->getIfNullSql(
  77. 'SUM((ABS(base_discount_amount) - ' . $connection->getIfNullSql(
  78. 'base_discount_canceled',
  79. 0
  80. ) . ') * base_to_global_rate)',
  81. 0
  82. ),
  83. 'total_amount' => $connection->getIfNullSql(
  84. 'SUM((base_subtotal - ' . $connection->getIfNullSql(
  85. 'base_subtotal_canceled',
  86. 0
  87. ) . ' - ' . $connection->getIfNullSql(
  88. 'ABS(base_discount_amount) - ABS('
  89. . $connection->getIfNullSql('base_discount_canceled', 0) . ')',
  90. 0
  91. ) . ' + ' . $connection->getIfNullSql(
  92. 'base_tax_amount - ' . $connection->getIfNullSql('base_tax_canceled', 0),
  93. 0
  94. ) . ')
  95. * base_to_global_rate)',
  96. 0
  97. ),
  98. 'subtotal_amount_actual' => $connection->getIfNullSql(
  99. 'SUM((base_subtotal_invoiced - ' . $connection->getIfNullSql(
  100. 'base_subtotal_refunded',
  101. 0
  102. ) . ') * base_to_global_rate)',
  103. 0
  104. ),
  105. 'discount_amount_actual' => $connection->getIfNullSql(
  106. 'SUM((base_discount_invoiced - ' . $connection->getIfNullSql(
  107. 'base_discount_refunded',
  108. 0
  109. ) . ')
  110. * base_to_global_rate)',
  111. 0
  112. ),
  113. 'total_amount_actual' => $connection->getIfNullSql(
  114. 'SUM((base_subtotal_invoiced - ' . $connection->getIfNullSql(
  115. 'base_subtotal_refunded',
  116. 0
  117. ) . ' - ' . $connection->getIfNullSql(
  118. 'ABS(base_discount_invoiced) - ABS('
  119. . $connection->getIfNullSql('base_discount_refunded', 0) . ')',
  120. 0
  121. ) . ' + ' . $connection->getIfNullSql(
  122. 'base_tax_invoiced - ' . $connection->getIfNullSql('base_tax_refunded', 0),
  123. 0
  124. ) . ') * base_to_global_rate)',
  125. 0
  126. ),
  127. ];
  128. $select = $connection->select();
  129. $select->from(['source_table' => $sourceTable], $columns)->where('coupon_code IS NOT NULL');
  130. if ($subSelect !== null) {
  131. $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period', $salesAdapter));
  132. }
  133. $select->group([$periodExpr, 'store_id', 'status', 'coupon_code']);
  134. $select->having('COUNT(entity_id) > 0');
  135. $aggregatedData = $salesAdapter->fetchAll($select);
  136. if ($aggregatedData) {
  137. $connection->insertOnDuplicate($table, $aggregatedData, array_keys($columns));
  138. }
  139. $select->reset();
  140. $columns = [
  141. 'period' => 'period',
  142. 'store_id' => new \Zend_Db_Expr('0'),
  143. 'order_status' => 'order_status',
  144. 'coupon_code' => 'coupon_code',
  145. 'rule_name' => 'rule_name',
  146. 'coupon_uses' => 'SUM(coupon_uses)',
  147. 'subtotal_amount' => 'SUM(subtotal_amount)',
  148. 'discount_amount' => 'SUM(discount_amount)',
  149. 'total_amount' => 'SUM(total_amount)',
  150. 'subtotal_amount_actual' => 'SUM(subtotal_amount_actual)',
  151. 'discount_amount_actual' => 'SUM(discount_amount_actual)',
  152. 'total_amount_actual' => 'SUM(total_amount_actual)',
  153. ];
  154. $select->from($table, $columns)->where('store_id <> 0');
  155. if ($subSelect !== null) {
  156. $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period', $salesAdapter));
  157. }
  158. $select->group(['period', 'order_status', 'coupon_code']);
  159. $connection->query($select->insertFromSelect($table, array_keys($columns)));
  160. $connection->commit();
  161. } catch (\Exception $e) {
  162. $connection->rollBack();
  163. throw $e;
  164. }
  165. return $this;
  166. }
  167. }