getAvailableShipmentMethods()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
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\Business\Quote;
9
10
use ArrayObject;
11
use Exception;
12
use Generated\Shared\Transfer\ExpenseTransfer;
13
use Generated\Shared\Transfer\QuoteTransfer;
14
use Generated\Shared\Transfer\ShipmentMethodTransfer;
15
use Generated\Shared\Transfer\ShipmentTransfer;
16
use SprykerEco\Zed\AmazonPay\Dependency\Facade\AmazonPayToShipmentInterface;
17
18
class ShipmentDataQuoteUpdater implements QuoteUpdaterInterface
19
{
20
    /**
21
     * @see \Spryker\Shared\Shipment\ShipmentConstants::SHIPMENT_EXPENSE_TYPE
22
     * @see \Spryker\Shared\Shipment\ShipmentConfig::SHIPMENT_EXPENSE_TYPE
23
     *
24
     * @deprecated Necessary in order to save compatibility with spryker/shipping version less than "^8.0.0".
25
     * use \Spryker\Shared\Shipment\ShipmentConfig::SHIPMENT_EXPENSE_TYPE instead if shipping version is higher
26
     */
27
    protected const SHIPMENT_EXPENSE_TYPE = 'SHIPMENT_EXPENSE_TYPE';
28
29
    /**
30
     * @var \SprykerEco\Zed\AmazonPay\Dependency\Facade\AmazonPayToShipmentInterface
31
     */
32
    protected $shipmentFacade;
33
34
    /**
35
     * @param \SprykerEco\Zed\AmazonPay\Dependency\Facade\AmazonPayToShipmentInterface $shipmentFacade
36
     */
37
    public function __construct(AmazonPayToShipmentInterface $shipmentFacade)
38
    {
39
        $this->shipmentFacade = $shipmentFacade;
40
    }
41
42
    /**
43
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
44
     *
45
     * @return \Generated\Shared\Transfer\QuoteTransfer
46
     */
47
    public function update(QuoteTransfer $quoteTransfer)
48
    {
49
        $shipmentMethodTransfer = $this->getShipmentMethodByQuote($quoteTransfer);
50
51
        $quoteTransfer->getShipment()->setMethod($shipmentMethodTransfer);
52
        $quoteTransfer = $this->updateExpenses($quoteTransfer);
53
54
        return $quoteTransfer;
55
    }
56
57
    /**
58
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
59
     *
60
     * @throws \Exception
61
     *
62
     * @return \Generated\Shared\Transfer\ShipmentMethodTransfer|null
63
     */
64
    protected function getShipmentMethodByQuote(QuoteTransfer $quoteTransfer)
65
    {
66
        $shipmentMethodsTransfer = $this->getAvailableShipmentMethods($quoteTransfer);
67
        $idShipmentMethod = (int)$quoteTransfer->getShipment()->getShipmentSelection();
68
69
        foreach ($shipmentMethodsTransfer->getMethods() as $shipmentMethodTransfer) {
70
            if ($shipmentMethodTransfer->getIdShipmentMethod() === $idShipmentMethod) {
71
                return $shipmentMethodTransfer;
72
            }
73
        }
74
75
        throw new Exception(sprintf('Shipment method #%s was not found , %s', $idShipmentMethod, json_encode($shipmentMethodsTransfer->toArray())));
76
    }
77
78
    /**
79
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
80
     *
81
     * @return \Generated\Shared\Transfer\ShipmentMethodsTransfer
82
     */
83
    protected function getAvailableShipmentMethods(QuoteTransfer $quoteTransfer)
84
    {
85
        return $this->shipmentFacade->getAvailableShipmentMethods($quoteTransfer);
86
    }
87
88
    /**
89
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
90
     *
91
     * @return \Generated\Shared\Transfer\QuoteTransfer
92
     */
93
    protected function updateExpenses(QuoteTransfer $quoteTransfer)
94
    {
95
        $expenseTransfer = $this->createShippingExpenseTransfer($quoteTransfer->getShipment()->getMethod());
96
97
        $otherExpenseCollection = new ArrayObject();
98
        foreach ($quoteTransfer->getExpenses() as $expense) {
99
            if ($expense->getType() !== static::SHIPMENT_EXPENSE_TYPE) {
100
                $otherExpenseCollection->append($expense);
101
            }
102
        }
103
104
        $quoteTransfer->setExpenses($otherExpenseCollection);
105
        $quoteTransfer->addExpense($expenseTransfer);
106
107
        return $quoteTransfer;
108
    }
109
110
    /**
111
     * @param \Generated\Shared\Transfer\ShipmentMethodTransfer $shipmentMethodTransfer
112
     *
113
     * @return \Generated\Shared\Transfer\ExpenseTransfer
114
     */
115
    protected function createShippingExpenseTransfer(ShipmentMethodTransfer $shipmentMethodTransfer)
116
    {
117
        $shipmentExpenseTransfer = new ExpenseTransfer();
118
        $shipmentExpenseTransfer->fromArray($shipmentMethodTransfer->toArray(), true);
119
        $shipmentExpenseTransfer->setType(static::SHIPMENT_EXPENSE_TYPE);
120
        $shipmentExpenseTransfer->setUnitGrossPrice($shipmentMethodTransfer->getStoreCurrencyPrice());
121
        $shipmentExpenseTransfer->setShipment((new ShipmentTransfer())->setMethod($shipmentMethodTransfer));
122
        $shipmentExpenseTransfer->setQuantity(1);
123
124
        return $shipmentExpenseTransfer;
125
    }
126
}
127