getRequestedAmountByOrderAndItems()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 2
nop 2
dl 0
loc 13
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Apache OSL-2
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Zed\AmazonPay\Communication\Plugin\Oms\Command;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\AddressTransfer;
12
use Generated\Shared\Transfer\AmazonpayCallTransfer;
13
use Generated\Shared\Transfer\ItemTransfer;
14
use IteratorAggregate;
15
use Orm\Zed\AmazonPay\Persistence\SpyPaymentAmazonpay;
16
use Orm\Zed\Oms\Persistence\SpyOmsOrderItemStateQuery;
17
use Orm\Zed\Sales\Persistence\SpySalesOrder;
18
use Orm\Zed\Sales\Persistence\SpySalesOrderAddress;
19
use Orm\Zed\Sales\Persistence\SpySalesOrderItem;
20
use Spryker\Zed\Kernel\Communication\AbstractPlugin;
21
use Spryker\Zed\Oms\Dependency\Plugin\Command\CommandByOrderInterface;
22
23
/**
24
 * @method \SprykerEco\Zed\AmazonPay\Business\AmazonPayFacadeInterface getFacade()
25
 * @method \SprykerEco\Zed\AmazonPay\Communication\AmazonPayCommunicationFactory getFactory()
26
 */
27
abstract class AbstractAmazonpayCommandPlugin extends AbstractPlugin implements CommandByOrderInterface
28
{
29
    /**
30
     * @see \Spryker\Shared\Shipment\ShipmentConstants::SHIPMENT_EXPENSE_TYPE | \Spryker\Shared\Shipment\ShipmentConfig::SHIPMENT_EXPENSE_TYPE
31
     *
32
     * @deprecated Necessary in order to save compatibility with spryker/shipping version less than "^8.0.0".
33
     * use \Spryker\Shared\Shipment\ShipmentConfig::SHIPMENT_EXPENSE_TYPE instead if shipping version is higher
34
     */
35
    protected const SHIPMENT_EXPENSE_TYPE = 'SHIPMENT_EXPENSE_TYPE';
36
37
    /**
38
     * @var bool
39
     */
40
    protected $wasShippingCharged;
41
42
    /**
43
     * @return string
44
     */
45
    protected function getAffectingRequestedAmountItemsStateFlag()
46
    {
47
        return '';
48
    }
49
50
    /**
51
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $orderEntity
52
     * @param \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[] $itemTransfers
53
     *
54
     * @return int
55
     */
56
    protected function getRequestedAmountByOrderAndItems(SpySalesOrder $orderEntity, ArrayObject $itemTransfers)
57
    {
58
        $subtotal = $this->getPriceToPay($itemTransfers);
59
60
        if (!$this->wasShippingCharged
61
            && $this->getFactory()
62
                ->createRequestAmountCalculator()
63
                ->shouldChargeShipping($orderEntity, $this->getAffectingRequestedAmountItemsStateFlag())) {
64
            $subtotal += $this->getShipmentPrice($orderEntity);
65
            $this->wasShippingCharged = true;
66
        }
67
68
        return $subtotal;
69
    }
70
71
    /**
72
     * @param \ArrayObject $itemTransfers
73
     *
74
     * @return int
75
     */
76
    protected function getPriceToPay(ArrayObject $itemTransfers)
77
    {
78
        $subtotal = 0;
79
80
        foreach ($itemTransfers as $itemTransfer) {
81
            $subtotal += $itemTransfer->getUnitPriceToPayAggregation();
82
        }
83
84
        return $subtotal;
85
    }
86
87
    /**
88
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $orderEntity
89
     *
90
     * @return int
91
     */
92
    protected function getShipmentPrice(SpySalesOrder $orderEntity)
93
    {
94
        return $this->getExpenseByType($orderEntity, static::SHIPMENT_EXPENSE_TYPE)
95
            ->getPriceToPayAggregation();
96
    }
97
98
    /**
99
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $orderEntity
100
     * @param string $type
101
     *
102
     * @return \Orm\Zed\Sales\Persistence\SpySalesExpense|null
103
     */
104
    protected function getExpenseByType(SpySalesOrder $orderEntity, $type)
105
    {
106
        foreach ($orderEntity->getExpenses() as $expense) {
107
            if ($expense->getType() === $type) {
108
                return $expense;
109
            }
110
        }
111
112
        return null;
113
    }
114
115
    /**
116
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
117
     *
118
     * @return \Generated\Shared\Transfer\AmazonpayCallTransfer[]
119
     */
120
    protected function groupSalesOrderItemsByAuthId(array $salesOrderItems)
121
    {
122
        $groups = [];
123
124
        foreach ($salesOrderItems as $salesOrderItem) {
125
            $payment = $this->getPaymentDetails($salesOrderItem);
126
127
            if (!$payment) {
128
                continue;
129
            }
130
131
            $groupData = $groups[$payment->getAuthorizationReferenceId()] ?? $this->createAmazonpayCallTransfer($payment);
132
133
            $groupData->addItem(
134
                $this->mapSalesOrderItemToItemTransfer($salesOrderItem)
135
            );
136
137
            $groups[$payment->getAuthorizationReferenceId()] = $groupData;
138
        }
139
140
        return $groups;
141
    }
142
143
    /**
144
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
145
     *
146
     * @return \Generated\Shared\Transfer\AmazonpayCallTransfer[]
147
     */
148
    protected function groupSalesOrderItemsByCaptureId(array $salesOrderItems)
149
    {
150
        $groups = [];
151
152
        foreach ($salesOrderItems as $salesOrderItem) {
153
            $payment = $this->getPaymentDetails($salesOrderItem);
154
155
            if (!$payment) {
156
                continue;
157
            }
158
159
            $groupData = $groups[$payment->getAmazonCaptureId()] ?? $this->createAmazonpayCallTransfer($payment);
160
161
            $groupData->addItem(
162
                $this->mapSalesOrderItemToItemTransfer($salesOrderItem)
163
            );
164
165
            $groups[$payment->getAmazonCaptureId()] = $groupData;
166
        }
167
168
        return $groups;
169
    }
170
171
    /**
172
     * @param \Orm\Zed\AmazonPay\Persistence\SpyPaymentAmazonpay $payment
173
     *
174
     * @return \Generated\Shared\Transfer\AmazonpayCallTransfer
175
     */
176
    protected function createAmazonpayCallTransfer(SpyPaymentAmazonpay $payment)
177
    {
178
        $amazonPayment = $this->getFactory()
179
            ->createPaymentAmazonpayConverter()
180
            ->mapEntityToTransfer($payment);
181
182
        $amazonpayCallTransfer = new AmazonpayCallTransfer();
183
        $amazonpayCallTransfer->setAmazonpayPayment($amazonPayment);
184
185
        return $amazonpayCallTransfer;
186
    }
187
188
    /**
189
     * @param \Generated\Shared\Transfer\AmazonpayCallTransfer $amazonpayCallTransfer
190
     * @param array $salesOrderItems
191
     *
192
     * @return void
193
     */
194
    protected function populateItems(AmazonpayCallTransfer $amazonpayCallTransfer, array $salesOrderItems)
195
    {
196
        $amazonpayCallTransfer->setItems(
197
            new ArrayObject(
198
                array_map([$this, 'mapSalesOrderItemToItemTransfer'], $salesOrderItems)
199
            )
200
        );
201
    }
202
203
    /**
204
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem $salesOrderItem
205
     *
206
     * @return \Orm\Zed\AmazonPay\Persistence\SpyPaymentAmazonpay|null
207
     */
208
    protected function getPaymentDetails(SpySalesOrderItem $salesOrderItem)
209
    {
210
        /** @var \Orm\Zed\AmazonPay\Persistence\SpyPaymentAmazonpaySalesOrderItem|null $payment */
211
        $payment = $salesOrderItem->getSpyPaymentAmazonpaySalesOrderItems()->getLast();
212
213
        if ($payment === null) {
214
            return null;
215
        }
216
217
        return $payment->getSpyPaymentAmazonpay();
218
    }
219
220
    /**
221
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem $salesOrderItemEntity
222
     *
223
     * @return \Generated\Shared\Transfer\ItemTransfer
224
     */
225
    protected function mapSalesOrderItemToItemTransfer(SpySalesOrderItem $salesOrderItemEntity)
226
    {
227
        $itemTransfer = (new ItemTransfer())
228
            ->fromArray($salesOrderItemEntity->toArray(), true);
229
230
        $itemTransfer->setUnitGrossPrice($salesOrderItemEntity->getGrossPrice());
231
        $itemTransfer->setUnitNetPrice($salesOrderItemEntity->getNetPrice());
232
        $itemTransfer->setUnitPrice($salesOrderItemEntity->getPrice());
233
        $itemTransfer->setUnitPriceToPayAggregation($salesOrderItemEntity->getPriceToPayAggregation());
234
        $itemTransfer->setUnitSubtotalAggregation($salesOrderItemEntity->getSubtotalAggregation());
235
        $itemTransfer->setUnitProductOptionPriceAggregation($salesOrderItemEntity->getProductOptionPriceAggregation());
236
        $itemTransfer->setUnitExpensePriceAggregation($salesOrderItemEntity->getExpensePriceAggregation());
237
        $itemTransfer->setUnitTaxAmount($salesOrderItemEntity->getTaxAmount());
238
        $itemTransfer->setUnitTaxAmountFullAggregation($salesOrderItemEntity->getTaxAmountFullAggregation());
239
        $itemTransfer->setUnitDiscountAmountAggregation($salesOrderItemEntity->getDiscountAmountAggregation());
240
        $itemTransfer->setUnitDiscountAmountFullAggregation($salesOrderItemEntity->getDiscountAmountFullAggregation());
241
        $itemTransfer->setRefundableAmount($salesOrderItemEntity->getRefundableAmount());
242
243
        return $itemTransfer;
244
    }
245
246
    /**
247
     * @param \IteratorAggregate|\Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
248
     * @param string $statusName
249
     *
250
     * @return void
251
     */
252
    protected function setOrderItemsStatus(IteratorAggregate $salesOrderItems, $statusName)
253
    {
254
        $statusEntity = $this->getOmsStatusByName($statusName);
255
256
        foreach ($salesOrderItems as $salesOrderItem) {
257
            $salesOrderItem->setFkOmsOrderItemState($statusEntity->getIdOmsOrderItemState());
258
            $salesOrderItem->save();
259
        }
260
    }
261
262
    /**
263
     * @param string $statusName
264
     *
265
     * @return \Orm\Zed\Oms\Persistence\SpyOmsOrderItemState
266
     */
267
    protected function getOmsStatusByName($statusName)
268
    {
269
        $statusEntity = SpyOmsOrderItemStateQuery::create()->filterByName($statusName)
270
            ->findOneOrCreate();
271
        $statusEntity->save();
272
273
        return $statusEntity;
274
    }
275
276
    /**
277
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderAddress $address
278
     *
279
     * @return \Generated\Shared\Transfer\AddressTransfer
280
     */
281
    protected function buildAddressTransfer(SpySalesOrderAddress $address)
282
    {
283
        return (new AddressTransfer())
284
            ->fromArray($address->toArray(), true)
285
            ->fromArray($address->getCountry()->toArray(), true);
286
    }
287
288
    /**
289
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
290
     *
291
     * @return \Orm\Zed\AmazonPay\Persistence\SpyPaymentAmazonpay
292
     */
293
    protected function getPayment(array $salesOrderItems)
294
    {
295
        return $this->getPaymentDetails($salesOrderItems[0]);
296
    }
297
}
298