123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\ResourceModel\Report;
- /**
- * Refund report resource model
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Refunded extends AbstractReport
- {
- /**
- * Model initialization
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_setResource('sales');
- }
- /**
- * Aggregate Refunded data
- *
- * @param string|int|\DateTime|array|null $from
- * @param string|int|\DateTime|array|null $to
- * @return $this
- */
- public function aggregate($from = null, $to = null)
- {
- $this->_aggregateByOrderCreatedAt($from, $to);
- $this->_aggregateByRefundCreatedAt($from, $to);
- $this->_setFlagData(\Magento\Reports\Model\Flag::REPORT_REFUNDED_FLAG_CODE);
- return $this;
- }
- /**
- * Aggregate refunded data by order created at as period
- *
- * @param string|null $from
- * @param string|null $to
- * @return $this
- * @throws \Exception
- */
- protected function _aggregateByOrderCreatedAt($from, $to)
- {
- $table = $this->getTable('sales_refunded_aggregated_order');
- $sourceTable = $this->getTable('sales_order');
- $connection = $this->getConnection();
- $connection->beginTransaction();
- try {
- if ($from !== null || $to !== null) {
- $subSelect = $this->_getTableDateRangeSelect($sourceTable, 'created_at', 'updated_at', $from, $to);
- } else {
- $subSelect = null;
- }
- $this->_clearTableByDateRange($table, $from, $to, $subSelect);
- // convert dates to current admin timezone
- $periodExpr = $connection->getDatePartSql(
- $this->getStoreTZOffsetQuery($sourceTable, 'created_at', $from, $to)
- );
- $columns = [
- 'period' => $periodExpr,
- 'store_id' => 'store_id',
- 'order_status' => 'status',
- 'orders_count' => new \Zend_Db_Expr('COUNT(total_refunded)'),
- 'refunded' => new \Zend_Db_Expr('SUM(base_total_refunded * base_to_global_rate)'),
- 'online_refunded' => new \Zend_Db_Expr('SUM(base_total_online_refunded * base_to_global_rate)'),
- 'offline_refunded' => new \Zend_Db_Expr('SUM(base_total_offline_refunded * base_to_global_rate)'),
- ];
- $select = $connection->select();
- $select->from(
- $sourceTable,
- $columns
- )->where(
- 'state != ?',
- \Magento\Sales\Model\Order::STATE_CANCELED
- )->where(
- 'base_total_refunded > ?',
- 0
- );
- if ($subSelect !== null) {
- $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
- }
- $select->group([$periodExpr, 'store_id', 'status']);
- $select->having('orders_count > 0');
- $insertQuery = $select->insertFromSelect($table, array_keys($columns));
- $connection->query($insertQuery);
- $select->reset();
- $columns = [
- 'period' => 'period',
- 'store_id' => new \Zend_Db_Expr('0'),
- 'order_status' => 'order_status',
- 'orders_count' => new \Zend_Db_Expr('SUM(orders_count)'),
- 'refunded' => new \Zend_Db_Expr('SUM(refunded)'),
- 'online_refunded' => new \Zend_Db_Expr('SUM(online_refunded)'),
- 'offline_refunded' => new \Zend_Db_Expr('SUM(offline_refunded)'),
- ];
- $select->from($table, $columns)->where('store_id != ?', 0);
- if ($subSelect !== null) {
- $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
- }
- $select->group(['period', 'order_status']);
- $insertQuery = $select->insertFromSelect($table, array_keys($columns));
- $connection->query($insertQuery);
- $connection->commit();
- } catch (\Exception $e) {
- $connection->rollBack();
- throw $e;
- }
- return $this;
- }
- /**
- * Aggregate refunded data by creditmemo created at as period
- *
- * @param string|null $from
- * @param string|null $to
- * @return $this
- * @throws \Exception
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- protected function _aggregateByRefundCreatedAt($from, $to)
- {
- $table = $this->getTable('sales_refunded_aggregated');
- $sourceTable = $this->getTable('sales_creditmemo');
- $orderTable = $this->getTable('sales_order');
- $connection = $this->getConnection();
- $connection->beginTransaction();
- try {
- if ($from !== null || $to !== null) {
- $subSelect = $this->_getTableDateRangeRelatedSelect(
- $sourceTable,
- $orderTable,
- ['order_id' => 'entity_id'],
- 'created_at',
- 'updated_at',
- $from,
- $to
- );
- } else {
- $subSelect = null;
- }
- $this->_clearTableByDateRange($table, $from, $to, $subSelect);
- // convert dates to current admin timezone
- $periodExpr = $connection->getDatePartSql(
- $this->getStoreTZOffsetQuery(
- ['source_table' => $sourceTable],
- 'source_table.created_at',
- $from,
- $to
- )
- );
- $columns = [
- 'period' => $periodExpr,
- 'store_id' => 'order_table.store_id',
- 'order_status' => 'order_table.status',
- 'orders_count' => new \Zend_Db_Expr('COUNT(order_table.entity_id)'),
- 'refunded' => new \Zend_Db_Expr(
- 'SUM(order_table.base_total_refunded * order_table.base_to_global_rate)'
- ),
- 'online_refunded' => new \Zend_Db_Expr(
- 'SUM(order_table.base_total_online_refunded * order_table.base_to_global_rate)'
- ),
- 'offline_refunded' => new \Zend_Db_Expr(
- 'SUM(order_table.base_total_offline_refunded * order_table.base_to_global_rate)'
- ),
- ];
- $select = $connection->select();
- $select->from(
- ['source_table' => $sourceTable],
- $columns
- )->joinInner(
- ['order_table' => $orderTable],
- 'source_table.order_id = order_table.entity_id AND ' . $connection->quoteInto(
- 'order_table.state != ?',
- \Magento\Sales\Model\Order::STATE_CANCELED
- ) . ' AND order_table.base_total_refunded > 0',
- []
- );
- $filterSubSelect = $connection->select();
- $filterSubSelect->from(
- ['filter_source_table' => $sourceTable],
- new \Zend_Db_Expr('MAX(filter_source_table.entity_id)')
- )->where(
- 'filter_source_table.order_id = source_table.order_id'
- );
- if ($subSelect !== null) {
- $select->having($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
- }
- $select->where('source_table.entity_id = (?)', new \Zend_Db_Expr($filterSubSelect));
- unset($filterSubSelect);
- $select->group([$periodExpr, 'order_table.store_id', 'order_table.status']);
- $select->having('orders_count > 0');
- $insertQuery = $select->insertFromSelect($table, array_keys($columns));
- $connection->query($insertQuery);
- $select->reset();
- $columns = [
- 'period' => 'period',
- 'store_id' => new \Zend_Db_Expr('0'),
- 'order_status' => 'order_status',
- 'orders_count' => new \Zend_Db_Expr('SUM(orders_count)'),
- 'refunded' => new \Zend_Db_Expr('SUM(refunded)'),
- 'online_refunded' => new \Zend_Db_Expr('SUM(online_refunded)'),
- 'offline_refunded' => new \Zend_Db_Expr('SUM(offline_refunded)'),
- ];
- $select->from($table, $columns)->where('store_id != ?', 0);
- if ($subSelect !== null) {
- $select->where($this->_makeConditionFromDateRangeSelect($subSelect, 'period'));
- }
- $select->group(['period', 'order_status']);
- $insertQuery = $select->insertFromSelect($table, array_keys($columns));
- $connection->query($insertQuery);
- } catch (\Exception $e) {
- $connection->rollBack();
- throw $e;
- }
- $connection->commit();
- return $this;
- }
- }
|