RefundOrderTransaction::findAmount()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 3
nop 0
dl 0
loc 16
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * MIT License
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
namespace SprykerEco\Zed\Braintree\Business\Payment\Transaction;
9
10
use Braintree\Transaction;
11
use Braintree\Transaction as BraintreeTransaction;
12
use Generated\Shared\Transfer\ExpenseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ExpenseTransfer 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...
13
use Spryker\Shared\Shipment\ShipmentConfig;
14
use SprykerEco\Zed\Braintree\BraintreeConfig;
15
use SprykerEco\Zed\Braintree\Business\Payment\Method\ApiConstants;
16
use SprykerEco\Zed\Braintree\Business\Payment\Transaction\Handler\ShipmentRefundTransactionHandlerInterface;
17
use SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToMoneyFacadeInterface;
18
use SprykerEco\Zed\Braintree\Persistence\BraintreeRepositoryInterface;
19
20
class RefundOrderTransaction extends AbstractTransaction
21
{
22
    /**
23
     * @see \Spryker\Shared\Shipment\ShipmentConfig::SHIPMENT_EXPENSE_TYPE|\Spryker\Shared\Shipment\ShipmentConstants::SHIPMENT_EXPENSE_TYPE
24
     */
25
    protected const SHIPMENT_EXPENSE_TYPE = 'SHIPMENT_EXPENSE_TYPE';
26
27
    /**
28
     * @var \SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToMoneyFacadeInterface
29
     */
30
    protected $moneyFacade;
31
32
    /**
33
     * @var \SprykerEco\Zed\Braintree\Business\Payment\Transaction\Handler\ShipmentRefundTransactionHandlerInterface
34
     */
35
    protected $shipmentRefundTransactionHandler;
36
37
    /**
38
     * @var \SprykerEco\Zed\Braintree\Persistence\BraintreeRepositoryInterface
39
     */
40
    protected $braintreeRepository;
41
42
    /**
43
     * @param \SprykerEco\Zed\Braintree\BraintreeConfig $brainTreeConfig
44
     * @param \SprykerEco\Zed\Braintree\Dependency\Facade\BraintreeToMoneyFacadeInterface $moneyFacade
45
     * @param \SprykerEco\Zed\Braintree\Business\Payment\Transaction\Handler\ShipmentRefundTransactionHandlerInterface $shipmentRefundTransactionHandler
46
     * @param \SprykerEco\Zed\Braintree\Persistence\BraintreeRepositoryInterface $braintreeRepository
47
     */
48
    public function __construct(
49
        BraintreeConfig $brainTreeConfig,
50
        BraintreeToMoneyFacadeInterface $moneyFacade,
51
        ShipmentRefundTransactionHandlerInterface $shipmentRefundTransactionHandler,
52
        BraintreeRepositoryInterface $braintreeRepository
53
    ) {
54
        parent::__construct($brainTreeConfig);
55
        $this->moneyFacade = $moneyFacade;
56
        $this->shipmentRefundTransactionHandler = $shipmentRefundTransactionHandler;
57
        $this->braintreeRepository = $braintreeRepository;
58
    }
59
60
    /**
61
     * @return string
62
     */
63
    protected function getTransactionType(): string
64
    {
65
        return ApiConstants::CREDIT;
66
    }
67
68
    /**
69
     * @return string
70
     */
71
    protected function getTransactionCode(): string
72
    {
73
        return ApiConstants::TRANSACTION_CODE_REFUND;
74
    }
75
76
    /**
77
     * @return \Braintree\Result\Error|\Braintree\Result\Successful
78
     */
79
    public function doTransaction()
80
    {
81
        return $this->refund();
82
    }
83
84
    /**
85
     * @return \Braintree\Result\Error|\Braintree\Result\Successful
86
     */
87
    protected function refund()
88
    {
89
        $transaction = $this->findTransaction();
90
91
        if ($transaction->status === ApiConstants::STATUS_CODE_CAPTURE_SUBMITTED) {
92
            return BraintreeTransaction::void($this->getTransactionIdentifier());
93
        }
94
95
        return BraintreeTransaction::refund(
96
            $this->getTransactionIdentifier(),
97
            $this->findAmount()
98
        );
99
    }
100
101
    /**
102
     * @return float|null
103
     */
104
    protected function findAmount(): ?float
105
    {
106
        $refundTransfer = $this->transactionMetaTransfer->requireRefund()->getRefund();
107
        $amount = $refundTransfer->getAmount();
108
109
        if (!$amount) {
110
            return null;
111
        }
112
113
        $shipmentExpenseTransfer = $this->findShipmentExpenseTransfer();
114
115
        if ($shipmentExpenseTransfer) {
116
            $amount = $amount - $shipmentExpenseTransfer->getUnitPriceToPayAggregation();
117
        }
118
119
        return $this->moneyFacade->convertIntegerToDecimal($amount);
120
    }
121
122
    /**
123
     * @return \Braintree\Transaction
124
     */
125
    protected function findTransaction(): Transaction
126
    {
127
        return BraintreeTransaction::find($this->getTransactionIdentifier());
128
    }
129
130
    /**
131
     * @return \Generated\Shared\Transfer\ExpenseTransfer|null
132
     */
133
    protected function findShipmentExpenseTransfer(): ?ExpenseTransfer
134
    {
135
        foreach ($this->transactionMetaTransfer->getRefund()->getExpenses() as $expenseTransfer) {
136
            if ($expenseTransfer->getType() === static::SHIPMENT_EXPENSE_TYPE) {
137
                return $expenseTransfer;
138
            }
139
        }
140
141
        return null;
142
    }
143
}
144