Passed
Push — feature/paypal-express ( 8eac93...3cde97 )
by Volodymyr
05:19
created

getOrderItemsGroupedByTransaction()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 20
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 11
nc 2
nop 1
dl 0
loc 20
rs 9.9
c 0
b 0
f 0
1
<?php
2
3
4
namespace SprykerEco\Zed\Braintree\Business\Payment\Transaction\Handler;
5
6
7
use ArrayObject;
8
use Generated\Shared\Transfer\ItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ItemTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
use Generated\Shared\Transfer\RefundTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\RefundTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
10
use Generated\Shared\Transfer\TransactionMetaTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\TransactionMetaTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
11
use Orm\Zed\Sales\Persistence\SpySalesOrder;
0 ignored issues
show
Bug introduced by
The type Orm\Zed\Sales\Persistence\SpySalesOrder was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use SprykerEco\Zed\Braintree\Business\Payment\Transaction\MetaVisitor\TransactionMetaVisitorInterface;
13
use SprykerEco\Zed\Braintree\Business\Payment\Transaction\TransactionInterface;
14
use SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToRefundFacadeInterface;
15
use SprykerEco\Zed\Braintree\Persistence\BraintreeRepositoryInterface;
16
17
class RefundItemsTransactionHandler extends AbstractTransactionHandler implements RefundItemsTransactionHandlerInterface
18
{
19
    protected const KEY_AMOUNT = 'amount';
20
    protected const KEY_PAYMENT_ID = 'payment_id';
21
22
    /**
23
     * @var \SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToRefundFacadeInterface
24
     */
25
    protected $refundFacade;
26
27
    /**
28
     * @var BraintreeRepositoryInterface
29
     */
30
    protected $braintreeRepository;
31
32
    /**
33
     * @param \SprykerEco\Zed\Braintree\Business\Payment\Transaction\TransactionInterface $transaction
34
     * @param \SprykerEco\Zed\Braintree\Business\Payment\Transaction\MetaVisitor\TransactionMetaVisitorInterface $transactionMetaVisitor
35
     * @param \SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToRefundFacadeInterface $refundFacade
36
     * @param BraintreeRepositoryInterface $braintreeRepository
37
     */
38
    public function __construct(
39
        TransactionInterface $transaction,
40
        TransactionMetaVisitorInterface $transactionMetaVisitor,
41
        BraintreeToRefundFacadeInterface $refundFacade,
42
        BraintreeRepositoryInterface $braintreeRepository
43
    ) {
44
        parent::__construct($transaction, $transactionMetaVisitor);
45
46
        $this->refundFacade = $refundFacade;
47
        $this->braintreeRepository = $braintreeRepository;
48
    }
49
50
    /**
51
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
52
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $salesOrderEntity
53
     *
54
     * @return void
55
     */
56
    public function refund(array $salesOrderItems, SpySalesOrder $salesOrderEntity): void
57
    {
58
        $refundTransfer = $this->getRefund($salesOrderItems, $salesOrderEntity);
59
        $transactionMetaTransfer = $this->getTransactionMetaTransfer($salesOrderItems, $salesOrderEntity, $refundTransfer);
60
61
        $orderItemsGroupedByTransaction = $this->getOrderItemsGroupedByTransaction($transactionMetaTransfer);
62
63
64
        foreach ($orderItemsGroupedByTransaction as $transactionId => $data) {
65
            $transactionMetaTransfer->setIdPayment($data[static::KEY_PAYMENT_ID]);
66
            $transactionMetaTransfer->setTransactionIdentifier($transactionId);
67
            $transactionMetaTransfer->setRefundAmount($data[static::KEY_AMOUNT]);
68
69
            $braintreeTransactionResponseTransfer = $this->transaction->executeTransaction($transactionMetaTransfer);
70
71
            if ($braintreeTransactionResponseTransfer->getIsSuccess()) {
72
                $this->refundFacade->saveRefund($refundTransfer);
73
            }
74
        }
75
    }
76
77
    /**
78
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
79
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $salesOrderEntity
80
     *
81
     * @return \Generated\Shared\Transfer\RefundTransfer
82
     */
83
    protected function getRefund(array $salesOrderItems, SpySalesOrder $salesOrderEntity): RefundTransfer
84
    {
85
        return $this->refundFacade->calculateRefund($salesOrderItems, $salesOrderEntity);
86
    }
87
88
    /**
89
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $orderItems
90
     *
91
     * @return \ArrayObject
92
     */
93
    protected function getItemsForRefunding(array $orderItems): ArrayObject
94
    {
95
        $itemsForRefunding = [];
96
97
        foreach ($orderItems as $orderItem) {
98
            $itemTransfer = new ItemTransfer();
99
            $itemTransfer->fromArray($orderItem->toArray(), true);
100
            $itemsForRefunding[] = $itemTransfer;
101
        }
102
103
        return $this->getRefundedUniqItems($itemsForRefunding);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getRefunde...ems($itemsForRefunding) returns the type iterable which is incompatible with the type-hinted return ArrayObject.
Loading history...
104
    }
105
106
    /**
107
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrderItem[] $salesOrderItems
108
     * @param \Orm\Zed\Sales\Persistence\SpySalesOrder $salesOrderEntity
109
     * @param RefundTransfer $refundTransfer
110
     *
111
     * @return TransactionMetaTransfer
112
     */
113
    protected function getTransactionMetaTransfer(array $salesOrderItems, SpySalesOrder $salesOrderEntity, RefundTransfer $refundTransfer): TransactionMetaTransfer
114
    {
115
        $transactionMetaTransfer = new TransactionMetaTransfer();
116
        $transactionMetaTransfer->setIdSalesOrder($salesOrderEntity->getIdSalesOrder());
117
        $transactionMetaTransfer->setRefund($refundTransfer);
118
        $transactionMetaTransfer->setItems($this->getItemsForRefunding($salesOrderItems));
119
120
        return $transactionMetaTransfer;
121
    }
122
123
    /**
124
     * @param \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[] $itemTransfers
125
     *
126
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
127
     */
128
    protected function getRefundedUniqItems(array $itemTransfers): iterable
129
    {
130
        $uniqItems = [];
131
        $uniqItemIds = [];
132
133
        foreach ($itemTransfers as $itemTransfer) {
134
            if (!in_array($itemTransfer->getIdSalesOrderItem(), $uniqItemIds)) {
135
                $uniqItems[] = $itemTransfer;
136
                $uniqItemIds[] = $uniqItemIds;
137
            }
138
        }
139
140
        $uniqItems = new ArrayObject($uniqItems);
141
142
        return $uniqItems;
143
    }
144
145
    /**
146
     * @param TransactionMetaTransfer $transactionMetaTransfer
147
     *
148
     * @return array
149
     */
150
    protected function getOrderItemsGroupedByTransaction(TransactionMetaTransfer $transactionMetaTransfer): array
151
    {
152
        $itemsByTransactions = [];
153
154
        foreach ($transactionMetaTransfer->getItems() as $itemTransfer) {
155
            $paymentBraintreeOrderItemTransfer = $this->braintreeRepository
156
                ->findPaymentBraintreeOrderItemByIdSalesOrderItem($itemTransfer->getIdSalesOrderItem());
157
158
            $paymentBraintreeTransactionSatusLogTransfer = $this->braintreeRepository
159
                ->findPaymentBraintreeTransactionStatusLogQueryByPaymentBraintreeOrderItem($paymentBraintreeOrderItemTransfer->getIdPaymentBraintreeOrderItem());
160
161
            $amount = $itemsByTransactions[$paymentBraintreeTransactionSatusLogTransfer->getTransactionId()][static::KEY_AMOUNT] ?? 0;
162
163
            $itemsByTransactions[$paymentBraintreeTransactionSatusLogTransfer->getTransactionId()] = [
164
                static::KEY_PAYMENT_ID => $paymentBraintreeOrderItemTransfer->getFkPaymentBraintree(),
165
                static::KEY_AMOUNT => $amount + $itemTransfer->getPriceToPayAggregation(),
166
            ];
167
        }
168
169
        return $itemsByTransactions;
170
    }
171
}
172