Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Refunded.php
Go to the documentation of this file.
1 <?php
7 
13 class Refunded extends AbstractReport
14 {
20  protected function _construct()
21  {
22  $this->_setResource('sales');
23  }
24 
32  public function aggregate($from = null, $to = null)
33  {
34  $this->_aggregateByOrderCreatedAt($from, $to);
35  $this->_aggregateByRefundCreatedAt($from, $to);
36 
37  $this->_setFlagData(\Magento\Reports\Model\Flag::REPORT_REFUNDED_FLAG_CODE);
38  return $this;
39  }
40 
49  protected function _aggregateByOrderCreatedAt($from, $to)
50  {
51  $table = $this->getTable('sales_refunded_aggregated_order');
52  $sourceTable = $this->getTable('sales_order');
53  $connection = $this->getConnection();
54  $connection->beginTransaction();
55 
56  try {
57  if ($from !== null || $to !== null) {
58  $subSelect = $this->_getTableDateRangeSelect($sourceTable, 'created_at', 'updated_at', $from, $to);
59  } else {
60  $subSelect = null;
61  }
62 
63  $this->_clearTableByDateRange($table, $from, $to, $subSelect);
64  // convert dates to current admin timezone
65  $periodExpr = $connection->getDatePartSql(
66  $this->getStoreTZOffsetQuery($sourceTable, 'created_at', $from, $to)
67  );
68  $columns = [
69  'period' => $periodExpr,
70  'store_id' => 'store_id',
71  'order_status' => 'status',
72  'orders_count' => new \Zend_Db_Expr('COUNT(total_refunded)'),
73  'refunded' => new \Zend_Db_Expr('SUM(base_total_refunded * base_to_global_rate)'),
74  'online_refunded' => new \Zend_Db_Expr('SUM(base_total_online_refunded * base_to_global_rate)'),
75  'offline_refunded' => new \Zend_Db_Expr('SUM(base_total_offline_refunded * base_to_global_rate)'),
76  ];
77 
78  $select = $connection->select();
79  $select->from(
80  $sourceTable,
81  $columns
82  )->where(
83  'state != ?',
84  \Magento\Sales\Model\Order::STATE_CANCELED
85  )->where(
86  'base_total_refunded > ?',
87  0
88  );
89 
90  if ($subSelect !== null) {
91  $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
92  }
93 
94  $select->group([$periodExpr, 'store_id', 'status']);
95  $select->having('orders_count > 0');
96  $insertQuery = $select->insertFromSelect($table, array_keys($columns));
97  $connection->query($insertQuery);
98  $select->reset();
99 
100  $columns = [
101  'period' => 'period',
102  'store_id' => new \Zend_Db_Expr('0'),
103  'order_status' => 'order_status',
104  'orders_count' => new \Zend_Db_Expr('SUM(orders_count)'),
105  'refunded' => new \Zend_Db_Expr('SUM(refunded)'),
106  'online_refunded' => new \Zend_Db_Expr('SUM(online_refunded)'),
107  'offline_refunded' => new \Zend_Db_Expr('SUM(offline_refunded)'),
108  ];
109 
110  $select->from($table, $columns)->where('store_id != ?', 0);
111 
112  if ($subSelect !== null) {
113  $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
114  }
115 
116  $select->group(['period', 'order_status']);
117  $insertQuery = $select->insertFromSelect($table, array_keys($columns));
118  $connection->query($insertQuery);
119  $connection->commit();
120  } catch (\Exception $e) {
121  $connection->rollBack();
122  throw $e;
123  }
124 
125  return $this;
126  }
127 
137  protected function _aggregateByRefundCreatedAt($from, $to)
138  {
139  $table = $this->getTable('sales_refunded_aggregated');
140  $sourceTable = $this->getTable('sales_creditmemo');
141  $orderTable = $this->getTable('sales_order');
142  $connection = $this->getConnection();
143  $connection->beginTransaction();
144 
145  try {
146  if ($from !== null || $to !== null) {
147  $subSelect = $this->_getTableDateRangeRelatedSelect(
148  $sourceTable,
149  $orderTable,
150  ['order_id' => 'entity_id'],
151  'created_at',
152  'updated_at',
153  $from,
154  $to
155  );
156  } else {
157  $subSelect = null;
158  }
159 
160  $this->_clearTableByDateRange($table, $from, $to, $subSelect);
161  // convert dates to current admin timezone
162  $periodExpr = $connection->getDatePartSql(
163  $this->getStoreTZOffsetQuery(
164  ['source_table' => $sourceTable],
165  'source_table.created_at',
166  $from,
167  $to
168  )
169  );
170 
171  $columns = [
172  'period' => $periodExpr,
173  'store_id' => 'order_table.store_id',
174  'order_status' => 'order_table.status',
175  'orders_count' => new \Zend_Db_Expr('COUNT(order_table.entity_id)'),
176  'refunded' => new \Zend_Db_Expr(
177  'SUM(order_table.base_total_refunded * order_table.base_to_global_rate)'
178  ),
179  'online_refunded' => new \Zend_Db_Expr(
180  'SUM(order_table.base_total_online_refunded * order_table.base_to_global_rate)'
181  ),
182  'offline_refunded' => new \Zend_Db_Expr(
183  'SUM(order_table.base_total_offline_refunded * order_table.base_to_global_rate)'
184  ),
185  ];
186 
187  $select = $connection->select();
188  $select->from(
189  ['source_table' => $sourceTable],
190  $columns
191  )->joinInner(
192  ['order_table' => $orderTable],
193  'source_table.order_id = order_table.entity_id AND ' . $connection->quoteInto(
194  'order_table.state != ?',
195  \Magento\Sales\Model\Order::STATE_CANCELED
196  ) . ' AND order_table.base_total_refunded > 0',
197  []
198  );
199 
200  $filterSubSelect = $connection->select();
201  $filterSubSelect->from(
202  ['filter_source_table' => $sourceTable],
203  new \Zend_Db_Expr('MAX(filter_source_table.entity_id)')
204  )->where(
205  'filter_source_table.order_id = source_table.order_id'
206  );
207 
208  if ($subSelect !== null) {
209  $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
210  }
211 
212  $select->where('source_table.entity_id = (?)', new \Zend_Db_Expr($filterSubSelect));
213  unset($filterSubSelect);
214 
215  $select->group([$periodExpr, 'order_table.store_id', 'order_table.status']);
216  $select->having('orders_count > 0');
217 
218  $insertQuery = $select->insertFromSelect($table, array_keys($columns));
219  $connection->query($insertQuery);
220  $select->reset();
221 
222  $columns = [
223  'period' => 'period',
224  'store_id' => new \Zend_Db_Expr('0'),
225  'order_status' => 'order_status',
226  'orders_count' => new \Zend_Db_Expr('SUM(orders_count)'),
227  'refunded' => new \Zend_Db_Expr('SUM(refunded)'),
228  'online_refunded' => new \Zend_Db_Expr('SUM(online_refunded)'),
229  'offline_refunded' => new \Zend_Db_Expr('SUM(offline_refunded)'),
230  ];
231 
232  $select->from($table, $columns)->where('store_id != ?', 0);
233 
234  if ($subSelect !== null) {
235  $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
236  }
237 
238  $select->group(['period', 'order_status']);
239  $insertQuery = $select->insertFromSelect($table, array_keys($columns));
240  $connection->query($insertQuery);
241  } catch (\Exception $e) {
242  $connection->rollBack();
243  throw $e;
244  }
245  $connection->commit();
246  return $this;
247  }
248 }
_makeConditionFromDateRangeSelect($select, $periodColumn, $connection=null)
getStoreTZOffsetQuery( $table, $column, $from=null, $to=null, $store=null, $connection=null)
_clearTableByDateRange( $table, $from=null, $to=null, $subSelect=null, $doNotUseTruncate=false, $connection=null)
$columns
Definition: default.phtml:15
_getTableDateRangeSelect( $table, $column, $whereColumn, $from=null, $to=null, $additionalWhere=[], $alias='date_range_table')
$connection
Definition: bulk.php:13
$table
Definition: trigger.php:14
_getTableDateRangeRelatedSelect( $table, $relatedTable, $joinCondition, $column, $whereColumn, $from=null, $to=null, $additionalWhere=[], $alias='date_range_table', $relatedAlias='related_date_range_table')