1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/**
* @copyright Vertex. All rights reserved. https://www.vertexinc.com/
* @author Mediotype https://www.mediotype.com/
*/
namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;
use Magento\Sales\Api\Data\CreditmemoInterface;
use Magento\Sales\Api\Data\CreditmemoItemInterface;
use Vertex\Data\LineItemInterface;
use Vertex\Services\Invoice\RequestInterface;
use Vertex\Tax\Model\ModuleManager;
/**
* Processes Giftwrapping and printed cards on a Creditmemo and converts them to a LineItemInterface
*/
class CreditmemoGiftwrapProcessor implements CreditmemoProcessorInterface
{
/** @var GiftWrapProcessor */
private $giftWrapProcessor;
/** @var ModuleManager */
private $moduleManager;
/**
* @param ModuleManager $moduleManager
* @param GiftWrapProcessor $giftWrapProcessor
*/
public function __construct(
ModuleManager $moduleManager,
GiftWrapProcessor $giftWrapProcessor
) {
$this->moduleManager = $moduleManager;
$this->giftWrapProcessor = $giftWrapProcessor;
}
/**
* @inheritdoc
*/
public function process(RequestInterface $request, CreditmemoInterface $creditmemo)
{
$lineItems = $request->getLineItems();
$extensionAttributes = $creditmemo->getExtensionAttributes();
if ($extensionAttributes === null || !$this->moduleManager->isEnabled('Magento_GiftWrapping')) {
return $request;
}
// Order-level Gift Wrapping
$orderGiftWrap = $this->giftWrapProcessor->processOrderGiftWrap(
$extensionAttributes->getGwBasePrice(),
$creditmemo->getStoreId()
);
if ($orderGiftWrap) {
$orderGiftWrap->setUnitPrice($orderGiftWrap->getUnitPrice() * -1);
$orderGiftWrap->setExtendedPrice($orderGiftWrap->getExtendedPrice() * -1);
$lineItems[] = $orderGiftWrap;
}
// Order-level Printed Card
$orderGiftcard = $this->giftWrapProcessor->processOrderGiftCard(
$extensionAttributes->getGwCardBasePrice(),
$creditmemo->getStoreId()
);
if ($orderGiftcard) {
$orderGiftcard->setUnitPrice($orderGiftcard->getUnitPrice() * -1);
$orderGiftcard->setExtendedPrice($orderGiftcard->getExtendedPrice() * -1);
$lineItems[] = $orderGiftcard;
}
// Item-level Gift Wrapping
$lineItems = array_merge($lineItems, $this->processItems($creditmemo));
$request->setLineItems($lineItems);
return $request;
}
/**
* Create LineItems for each individual item-level gift wrap
*
* @param CreditmemoInterface $creditmemo
* @return LineItemInterface[]
*/
private function processItems(CreditmemoInterface $creditmemo)
{
/** @var LineItemInterface[] $lineItems */
$lineItems = [];
if ($creditmemo->getExtensionAttributes() === null) {
return $lineItems;
}
/** @var CreditmemoItemInterface[] $creditmemoItems Indexed by Order Item ID */
$creditmemoItems = [];
/** @var int[] $orderItemIds */
$orderItemIds = [];
foreach ($creditmemo->getItems() as $item) {
if ($item->getQty() < 1) {
continue;
}
$orderItemIds[] = $item->getOrderItemId();
$creditmemoItems[$item->getOrderItemId()] = $item;
}
/** @var float[] $giftWrapAmounts Indexed by Order Item ID */
$giftWrapAmounts = $this->giftWrapProcessor->getGiftWrapAmounts(
$creditmemo->getOrderId(),
$orderItemIds,
(float)$creditmemo->getExtensionAttributes()->getGwItemsBasePrice()
);
foreach ($giftWrapAmounts as $orderItemId => $giftWrapAmount) {
$lineItems[] = $this->giftWrapProcessor->buildItem(
-1 * $giftWrapAmount,
$creditmemoItems[$orderItemId]->getSku(),
$creditmemo->getStoreId()
);
}
return $lineItems;
}
}