Skip to content

Commit c7a6e77

Browse files
author
Prabhu Ram
committed
Merge remote-tracking branch 'origin/28581_refund_details' into 241-customer-orders
2 parents 4f8767c + 1353a54 commit c7a6e77

24 files changed

+1168
-45
lines changed

app/code/Magento/BundleGraphQl/etc/graphql/di.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@
8686
</argument>
8787
</arguments>
8888
</type>
89+
<type name="Magento\SalesGraphQl\Model\TypeResolver\CreditMemoItem">
90+
<arguments>
91+
<argument name="productTypeMap" xsi:type="array">
92+
<item name="bundle" xsi:type="string">BundleCreditMemoItem</item>
93+
</argument>
94+
</arguments>
95+
</type>
8996
<type name="Magento\SalesGraphQl\Model\Shipment\ItemProvider">
9097
<arguments>
9198
<argument name="formatters" xsi:type="array">

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ type BundleShipmentItem implements ShipmentItemInterface {
100100
bundle_options: [ItemSelectedBundleOption] @doc(description: "A list of bundle options that are assigned to the bundle product") @resolver(class: "Magento\\BundleGraphQl\\Model\\Resolver\\Order\\Item\\BundleOptions")
101101
}
102102

103+
type BundleCreditMemoItem implements CreditMemoItemInterface {
104+
bundle_options: [ItemSelectedBundleOption] @doc(description: "A list of bundle options that are assigned to the bundle product")
105+
}
106+
103107
type ItemSelectedBundleOption @doc(description: "A list of options of the selected bundle product") {
104108
id: ID! @doc(description: "The unique identifier of the option")
105109
label: String! @doc(description: "The label of the option")
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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+
namespace Magento\SalesGraphQl\Model\Resolver\CreditMemo;
9+
10+
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\GraphQl\Config\Element\Field;
12+
use Magento\Framework\GraphQl\Query\ResolverInterface;
13+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
14+
use Magento\Sales\Api\Data\CreditmemoInterface;
15+
16+
/**
17+
* Resolve credit memo comments
18+
*/
19+
class CreditMemoComments implements ResolverInterface
20+
{
21+
/**
22+
* @inheritDoc
23+
*/
24+
public function resolve(
25+
Field $field,
26+
$context,
27+
ResolveInfo $info,
28+
array $value = null,
29+
array $args = null
30+
) {
31+
if (!(($value['model'] ?? null) instanceof CreditmemoInterface)) {
32+
throw new LocalizedException(__('"model" value should be specified'));
33+
}
34+
35+
/** @var CreditmemoInterface $creditMemo */
36+
$creditMemo = $value['model'];
37+
38+
$comments = [];
39+
foreach ($creditMemo->getComments() as $comment) {
40+
if ($comment->getIsVisibleOnFront()) {
41+
$comments[] = [
42+
'message' => $comment->getComment(),
43+
'timestamp' => $comment->getCreatedAt()
44+
];
45+
}
46+
}
47+
48+
return $comments;
49+
}
50+
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
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+
namespace Magento\SalesGraphQl\Model\Resolver\CreditMemo;
9+
10+
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Framework\GraphQl\Config\Element\Field;
12+
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
13+
use Magento\Framework\GraphQl\Query\ResolverInterface;
14+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
15+
use Magento\Sales\Api\Data\CreditmemoInterface;
16+
use Magento\Sales\Api\Data\CreditmemoItemInterface;
17+
use Magento\Sales\Api\Data\OrderInterface;
18+
use Magento\Sales\Api\Data\OrderItemInterface;
19+
use Magento\SalesGraphQl\Model\OrderItem\DataProvider as OrderItemProvider;
20+
21+
/**
22+
* Resolve credit memos items data
23+
*/
24+
class CreditMemoItems implements ResolverInterface
25+
{
26+
/**
27+
* @var ValueFactory
28+
*/
29+
private $valueFactory;
30+
31+
/**
32+
* @var OrderItemProvider
33+
*/
34+
private $orderItemProvider;
35+
36+
/**
37+
* @param ValueFactory $valueFactory
38+
* @param OrderItemProvider $orderItemProvider
39+
*/
40+
public function __construct(
41+
ValueFactory $valueFactory,
42+
OrderItemProvider $orderItemProvider
43+
) {
44+
$this->valueFactory = $valueFactory;
45+
$this->orderItemProvider = $orderItemProvider;
46+
}
47+
48+
/**
49+
* @inheritDoc
50+
*/
51+
public function resolve(
52+
Field $field,
53+
$context,
54+
ResolveInfo $info,
55+
array $value = null,
56+
array $args = null
57+
) {
58+
if (!(($value['model'] ?? null) instanceof CreditmemoInterface)) {
59+
throw new LocalizedException(__('"model" value should be specified'));
60+
}
61+
62+
if (!(($value['order'] ?? null) instanceof OrderInterface)) {
63+
throw new LocalizedException(__('"order" value should be specified'));
64+
}
65+
66+
/** @var CreditmemoInterface $creditMemoModel */
67+
$creditMemoModel = $value['model'];
68+
/** @var OrderInterface $parentOrderModel */
69+
$parentOrderModel = $value['order'];
70+
71+
return $this->valueFactory->create(
72+
$this->getCreditMemoItems($parentOrderModel, $creditMemoModel->getItems())
73+
);
74+
}
75+
76+
/**
77+
* Get credit memo items data as a promise
78+
*
79+
* @param OrderInterface $order
80+
* @param array $creditMemoItems
81+
* @return \Closure
82+
*/
83+
private function getCreditMemoItems(OrderInterface $order, array $creditMemoItems): \Closure
84+
{
85+
$orderItems = [];
86+
foreach ($creditMemoItems as $item) {
87+
$this->orderItemProvider->addOrderItemId((int)$item->getOrderItemId());
88+
}
89+
90+
return function () use ($order, $creditMemoItems, $orderItems): array {
91+
foreach ($creditMemoItems as $creditMemoItem) {
92+
$orderItem = $this->orderItemProvider->getOrderItemById((int)$creditMemoItem->getOrderItemId());
93+
/** @var OrderItemInterface $orderItemModel */
94+
$orderItemModel = $orderItem['model'];
95+
if (!$orderItemModel->getParentItem()) {
96+
$creditMemoItemData = $this->getCreditMemoItemData($order, $creditMemoItem);
97+
if (isset($creditMemoItemData)) {
98+
$orderItems[$creditMemoItem->getOrderItemId()] = $creditMemoItemData;
99+
}
100+
}
101+
}
102+
return $orderItems;
103+
};
104+
}
105+
106+
/**
107+
* Get credit memo item data
108+
*
109+
* @param OrderInterface $order
110+
* @param CreditmemoItemInterface $creditMemoItem
111+
* @return array
112+
*/
113+
private function getCreditMemoItemData(OrderInterface $order, CreditmemoItemInterface $creditMemoItem): array
114+
{
115+
$orderItem = $this->orderItemProvider->getOrderItemById((int)$creditMemoItem->getOrderItemId());
116+
return [
117+
'id' => base64_encode($creditMemoItem->getEntityId()),
118+
'product_name' => $creditMemoItem->getName(),
119+
'product_sku' => $creditMemoItem->getSku(),
120+
'product_sale_price' => [
121+
'value' => $creditMemoItem->getPrice(),
122+
'currency' => $order->getOrderCurrencyCode()
123+
],
124+
'quantity_refunded' => $creditMemoItem->getQty(),
125+
'model' => $creditMemoItem,
126+
'product_type' => $orderItem['product_type'],
127+
'discounts' => $this->formatDiscountDetails($order, $creditMemoItem)
128+
];
129+
}
130+
131+
/**
132+
* Returns formatted information about an applied discount
133+
*
134+
* @param OrderInterface $associatedOrder
135+
* @param CreditmemoItemInterface $creditmemoItem
136+
* @return array
137+
*/
138+
private function formatDiscountDetails(
139+
OrderInterface $associatedOrder,
140+
CreditmemoItemInterface $creditmemoItem
141+
): array {
142+
if ($associatedOrder->getDiscountDescription() === null
143+
&& $creditmemoItem->getDiscountAmount() == 0
144+
&& $associatedOrder->getDiscountAmount() == 0
145+
) {
146+
$discounts = [];
147+
} else {
148+
$discounts[] = [
149+
'label' => $associatedOrder->getDiscountDescription() ?? _('Discount'),
150+
'amount' => [
151+
'value' => abs($creditmemoItem->getDiscountAmount()) ?? 0,
152+
'currency' => $associatedOrder->getOrderCurrencyCode()
153+
]
154+
];
155+
}
156+
return $discounts;
157+
}
158+
}

0 commit comments

Comments
 (0)