Skip to content

Commit a3f48e0

Browse files
committed
ACP2E-3302: [Cloud] Incorrect Calculations in Coupon Usage Report
1 parent 25636db commit a3f48e0

File tree

4 files changed

+312
-32
lines changed

4 files changed

+312
-32
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Quote\Test\Fixture;
9+
10+
use Magento\Framework\DataObject;
11+
use Magento\Framework\Exception\NoSuchEntityException;
12+
use Magento\Quote\Api\CartRepositoryInterface;
13+
use Magento\TestFramework\Fixture\DataFixtureInterface;
14+
15+
class ApplyCoupon implements DataFixtureInterface
16+
{
17+
/**
18+
* @var CartRepositoryInterface
19+
*/
20+
public CartRepositoryInterface $quoteRepository;
21+
22+
/**
23+
* @param CartRepositoryInterface $quoteRepository
24+
*/
25+
public function __construct(
26+
CartRepositoryInterface $quoteRepository
27+
) {
28+
$this->quoteRepository = $quoteRepository;
29+
}
30+
31+
/**
32+
* {@inheritdoc}
33+
*
34+
* @param array $data Parameters
35+
* <pre>
36+
* $data = [
37+
* 'cart_id' => (string) Cart ID. Required.
38+
* 'coupon_codes' => (array) Coupon Codes. Required.
39+
* ]
40+
* </pre>
41+
* @throws NoSuchEntityException
42+
*/
43+
public function apply(array $data = []): ?DataObject
44+
{
45+
if (empty($data['cart_id']) || empty($data['coupon_codes'])) {
46+
throw new \InvalidArgumentException('cart_id or coupon_codes is missing!');
47+
}
48+
$quote = $this->quoteRepository->getActive($data['cart_id']);
49+
$quote->setCouponCode(reset($data['coupon_codes']));
50+
$quote->getExtensionAttributes()->setCouponCodes($data['coupon_codes']);
51+
$this->quoteRepository->save($quote->collectTotals());
52+
return $quote;
53+
}
54+
}

app/code/Magento/SalesRule/Model/ResourceModel/Report/Rule/Createdat.php

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,50 @@
66

77
namespace Magento\SalesRule\Model\ResourceModel\Report\Rule;
88

9+
use Magento\Framework\Model\ResourceModel\Db\Context;
10+
use Magento\Framework\Stdlib\DateTime\DateTime;
11+
use Magento\Framework\Stdlib\DateTime\Timezone\Validator;
12+
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
13+
use Magento\Reports\Model\FlagFactory;
14+
use Magento\Tax\Model\Config;
15+
use Psr\Log\LoggerInterface;
16+
917
/**
1018
* Rule report resource model with aggregation by created at
1119
*/
1220
class Createdat extends \Magento\Reports\Model\ResourceModel\Report\AbstractReport
1321
{
22+
/**
23+
* @param Context $context
24+
* @param LoggerInterface $logger
25+
* @param TimezoneInterface $localeDate
26+
* @param FlagFactory $reportsFlagFactory
27+
* @param Validator $timezoneValidator
28+
* @param DateTime $dateTime
29+
* @param Config $taxConfig
30+
* @param string|null $connectionName
31+
*/
32+
public function __construct(
33+
private readonly Context $context,
34+
private readonly LoggerInterface $logger,
35+
private readonly TimezoneInterface $localeDate,
36+
private readonly FlagFactory $reportsFlagFactory,
37+
private readonly Validator $timezoneValidator,
38+
DateTime $dateTime,
39+
private Config $taxConfig,
40+
string $connectionName = null
41+
) {
42+
parent::__construct(
43+
$context,
44+
$logger,
45+
$localeDate,
46+
$reportsFlagFactory,
47+
$timezoneValidator,
48+
$dateTime,
49+
$connectionName
50+
);
51+
}
52+
1453
/**
1554
* Resource Report Rule constructor
1655
*
@@ -65,6 +104,13 @@ protected function _aggregateByOrder($aggregationField, $from, $to)
65104
$this->getStoreTZOffsetQuery($sourceTable, $aggregationField, $from, $to, null, $salesAdapter)
66105
);
67106

107+
$subtotalAmountFiled = 'base_subtotal';
108+
$subtotalAmountActualFiled = 'base_subtotal_invoiced';
109+
if ($this->taxConfig->displaySalesSubtotalInclTax()) {
110+
$subtotalAmountFiled = 'base_subtotal_incl_tax';
111+
$subtotalAmountActualFiled = 'base_subtotal_incl_tax';
112+
}
113+
68114
$columns = [
69115
'period' => $periodExpr,
70116
'store_id' => 'store_id',
@@ -73,7 +119,7 @@ protected function _aggregateByOrder($aggregationField, $from, $to)
73119
'rule_name' => 'coupon_rule_name',
74120
'coupon_uses' => 'COUNT(entity_id)',
75121
'subtotal_amount' => $connection->getIfNullSql(
76-
'SUM((base_subtotal - ' . $connection->getIfNullSql(
122+
'SUM((' . $subtotalAmountFiled . ' - ' . $connection->getIfNullSql(
77123
'base_subtotal_canceled',
78124
0
79125
) . ') * base_to_global_rate)',
@@ -110,7 +156,7 @@ protected function _aggregateByOrder($aggregationField, $from, $to)
110156
0
111157
),
112158
'subtotal_amount_actual' => $connection->getIfNullSql(
113-
'SUM((base_subtotal_invoiced - ' . $connection->getIfNullSql(
159+
'SUM((' . $subtotalAmountActualFiled . ' - ' . $connection->getIfNullSql(
114160
'base_subtotal_refunded',
115161
0
116162
) . ') * base_to_global_rate)',

app/code/Magento/SalesRule/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"magento/module-checkout": "*",
2929
"magento/module-authorization": "*",
3030
"magento/module-asynchronous-operations": "*",
31-
"magento/module-multishipping": "*"
31+
"magento/module-multishipping": "*",
32+
"magento/module-tax": "*"
3233
},
3334
"suggest": {
3435
"magento/module-sales-rule-sample-data": "*"

0 commit comments

Comments
 (0)