Skip to content

Commit 31b34ad

Browse files
committed
Shopping cart discount concept
1 parent 02bca98 commit 31b34ad

File tree

6 files changed

+147
-5
lines changed

6 files changed

+147
-5
lines changed

app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
5656
'value' => $cartTotals->getSubtotalWithDiscount(), 'currency' => $currency
5757
],
5858
'applied_taxes' => $this->getAppliedTaxes($cartTotals, $currency),
59+
'discount' => $this->getDiscount($cartTotals, $currency),
5960
'model' => $quote
6061
];
6162
}
@@ -84,4 +85,19 @@ private function getAppliedTaxes(Total $total, string $currency): array
8485
}
8586
return $appliedTaxesData;
8687
}
88+
89+
/**
90+
* Returns information about an applied discount
91+
*
92+
* @param Total $total
93+
* @param string $currency
94+
* @return array
95+
*/
96+
private function getDiscount(Total $total, string $currency)
97+
{
98+
return [
99+
'label' => $total->getDiscountDescription(),
100+
'amount' => ['value' => $total->getDiscountAmount(), "currency" => $currency]
101+
];
102+
}
87103
}

app/code/Magento/QuoteGraphQl/etc/schema.graphqls

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ type CartPrices {
142142
grand_total: Money
143143
subtotal_including_tax: Money
144144
subtotal_excluding_tax: Money
145+
discount: CartDiscountItem
145146
subtotal_with_discount_excluding_tax: Money
146147
applied_taxes: [CartTaxItem]
147148
}
@@ -151,6 +152,11 @@ type CartTaxItem {
151152
label: String!
152153
}
153154

155+
type CartDiscountItem {
156+
amount: Money!
157+
label: String!
158+
}
159+
154160
type SetPaymentMethodOnCartOutput {
155161
cart: Cart!
156162
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ public function testGetTotalsWithNoTaxApplied()
8787
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
8888
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
8989
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
90-
* @group recent
9190
*/
9291
public function testGetCartTotalsWithNoAddressSet()
9392
{
@@ -125,6 +124,34 @@ public function testGetSelectedShippingMethodFromCustomerCart()
125124
$this->graphQlQuery($query);
126125
}
127126

127+
/**
128+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php
129+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
130+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
131+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
132+
* @group recent
133+
*/
134+
public function testGetDiscountInformation()
135+
{
136+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
137+
$query = $this->getQuery($maskedQuoteId);
138+
$response = $this->graphQlQuery($query);
139+
140+
$discountResponse = $response['cart']['prices']['discount'];
141+
self::assertEquals(-20, $discountResponse['amount']['value']);
142+
self::assertEquals('100% Off for all orders', $discountResponse['label']);
143+
}
144+
145+
public function testGetDiscountInformationWithTwoRulesApplied()
146+
{
147+
self::fail();
148+
}
149+
150+
public function testGetDiscountInformationForRuleWithNoLabel()
151+
{
152+
self::fail();
153+
}
154+
128155
/**
129156
* Generates GraphQl query for retrieving cart totals
130157
*
@@ -160,6 +187,13 @@ private function getQuery(string $maskedQuoteId): string
160187
currency
161188
}
162189
}
190+
discount {
191+
label
192+
amount {
193+
value
194+
currency
195+
}
196+
}
163197
}
164198
}
165199
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Customer\Model\GroupManagement as CustomerGroupManagement;
9+
use Magento\Framework\Api\DataObjectHelper;
10+
use Magento\SalesRule\Api\RuleRepositoryInterface;
11+
use Magento\SalesRule\Model\Data\Rule as RuleData;
12+
use Magento\Store\Model\StoreManagerInterface as StoreManagerInterface;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
15+
16+
$objectManager = Bootstrap::getObjectManager();
17+
/** @var RuleRepositoryInterface $ruleRepository */
18+
$ruleRepository = $objectManager->get(RuleRepositoryInterface::class);
19+
/** @var DataObjectHelper $dataObjectHelper */
20+
$dataObjectHelper = Bootstrap::getObjectManager()->get(DataObjectHelper::class);
21+
$ruleLabel = $objectManager->create(\Magento\SalesRule\Api\Data\RuleLabelInterface::class);
22+
$ruleLabelFactory = $objectManager->get(\Magento\SalesRule\Model\Data\RuleLabelFactory::class);
23+
24+
25+
/** @var RuleData $salesRule */
26+
$salesRule = $objectManager->create(RuleData::class);
27+
/** @var \Magento\SalesRule\Api\Data\RuleLabelInterface $ruleLabel */
28+
$ruleLabel = $ruleLabelFactory->create();
29+
$ruleLabel->setStoreId(0);
30+
$ruleLabel->setStoreLabel('50% Off for all orders');
31+
$ruleData = [
32+
'name' => '50% Off for all orders',
33+
'is_active' => 1,
34+
'customer_group_ids' => [CustomerGroupManagement::NOT_LOGGED_IN_ID],
35+
'coupon_type' => RuleData::COUPON_TYPE_NO_COUPON,
36+
'conditions' => [],
37+
'simple_action' => 'by_percent',
38+
'discount_amount' => 50,
39+
'discount_step' => 0,
40+
'website_ids' => [
41+
$objectManager->get(
42+
StoreManagerInterface::class
43+
)->getWebsite()->getId(),
44+
],
45+
'discount_qty' => 0,
46+
'apply_to_shipping' => 1,
47+
'simple_free_shipping' => 1,
48+
];
49+
$dataObjectHelper->populateWithArray($salesRule, $ruleData, \Magento\SalesRule\Api\Data\RuleInterface::class);
50+
$salesRule->setStoreLabels([$ruleLabel]);
51+
52+
$ruleRepository->save($salesRule);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\SalesRule\Api\RuleRepositoryInterface;
9+
use Magento\SalesRule\Model\ResourceModel\Rule as RuleResource;
10+
use Magento\SalesRule\Model\RuleFactory as RuleFactory;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
$objectManager = Bootstrap::getObjectManager();
14+
/** @var RuleRepositoryInterface $ruleRepository */
15+
$ruleRepository = $objectManager->get(RuleRepositoryInterface::class);
16+
/** @var RuleResource $ruleResource */
17+
$ruleResource = $objectManager->get(RuleResource::class);
18+
/** @var RuleFactory $ruleFactory */
19+
$ruleFactory = $objectManager->get(RuleFactory::class);
20+
$salesRule = $ruleFactory->create();
21+
22+
$ruleResource->load($salesRule, '50% Off for all orders', 'name');
23+
// FIXME: the rule cannot be found for some reason
24+
if ($salesRule->getRuleId()) {
25+
$ruleRepository->deleteById($salesRule->getRuleId());
26+
}

dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_100_percent_off_rollback.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,19 @@
55
*/
66
declare(strict_types=1);
77

8+
use Magento\Framework\Registry;
9+
use Magento\SalesRule\Api\RuleRepositoryInterface;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
$objectManager = Bootstrap::getObjectManager();
813
/** @var Magento\Framework\Registry $registry */
9-
$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
14+
$registry = Bootstrap::getObjectManager()->get(Registry::class);
15+
/** @var RuleRepositoryInterface $ruleRepository */
16+
$ruleRepository = $objectManager->get(RuleRepositoryInterface::class);
1017

1118
/** @var Magento\SalesRule\Model\Rule $rule */
12-
$rule = $registry->registry('cart_rule_100_percent_off');
13-
if ($rule) {
14-
$rule->delete();
19+
$ruleId = $registry->registry('Magento/SalesRule/_files/cart_rule_100_percent_off');
20+
21+
if ($ruleId) {
22+
$ruleRepository->deleteById($ruleId);
1523
}

0 commit comments

Comments
 (0)