AbstractOrderMapper::getPaymentMethodsTotal()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 4
c 1
b 0
f 0
dl 0
loc 12
rs 10
cc 2
nc 2
nop 1
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\Inxmail\Business\Mapper\Order;
9
10
use ArrayObject;
11
use DateTime;
12
use Generated\Shared\Transfer\InxmailRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\InxmailRequestTransfer 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 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...
14
use Generated\Shared\Transfer\OrderTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\OrderTransfer 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...
15
use Generated\Shared\Transfer\ProductAbstractTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ProductAbstractTransfer 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...
16
use SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToLocaleFacadeInterface;
17
use SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToMoneyFacadeInterface;
18
use SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToProductFacadeInterface;
19
use SprykerEco\Zed\Inxmail\Dependency\Service\InxmailToUtilDateTimeServiceInterface;
20
use SprykerEco\Zed\Inxmail\InxmailConfig;
21
22
abstract class AbstractOrderMapper implements OrderMapperInterface
23
{
24
    protected const SHIPMENT_EXPENSE_TYPE = 'SHIPMENT_EXPENSE_TYPE';
25
26
    /**
27
     * @var \SprykerEco\Zed\Inxmail\InxmailConfig
28
     */
29
    protected $config;
30
31
    /**
32
     * @var \SprykerEco\Zed\Inxmail\Dependency\Service\InxmailToUtilDateTimeServiceInterface
33
     */
34
    protected $dateTimeService;
35
36
    /**
37
     * @var \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToMoneyFacadeInterface
38
     */
39
    protected $moneyFacade;
40
41
    /**
42
     * @var \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToProductFacadeInterface
43
     */
44
    protected $productFacade;
45
46
    /**
47
     * @var \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToLocaleFacadeInterface
48
     */
49
    protected $localeFacade;
50
51
    /**
52
     * @param \SprykerEco\Zed\Inxmail\InxmailConfig $config
53
     * @param \SprykerEco\Zed\Inxmail\Dependency\Service\InxmailToUtilDateTimeServiceInterface $dateTimeService
54
     * @param \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToMoneyFacadeInterface $moneyFacade
55
     * @param \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToProductFacadeInterface $productFacade
56
     * @param \SprykerEco\Zed\Inxmail\Dependency\Facade\InxmailToLocaleFacadeInterface $localeFacade
57
     */
58
    public function __construct(
59
        InxmailConfig $config,
60
        InxmailToUtilDateTimeServiceInterface $dateTimeService,
61
        InxmailToMoneyFacadeInterface $moneyFacade,
62
        InxmailToProductFacadeInterface $productFacade,
63
        InxmailToLocaleFacadeInterface $localeFacade
64
    ) {
65
        $this->config = $config;
66
        $this->dateTimeService = $dateTimeService;
67
        $this->moneyFacade = $moneyFacade;
68
        $this->productFacade = $productFacade;
69
        $this->localeFacade = $localeFacade;
70
    }
71
72
    /**
73
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
74
     *
75
     * @return \Generated\Shared\Transfer\InxmailRequestTransfer
76
     */
77
    public function map(OrderTransfer $orderTransfer): InxmailRequestTransfer
78
    {
79
        $inxmailRequestTransfer = new InxmailRequestTransfer();
80
        $inxmailRequestTransfer->setEvent($this->getEvent());
81
        $inxmailRequestTransfer->setTransactionId($orderTransfer->getOrderReference());
82
        $inxmailRequestTransfer->setPayload($this->getPayload($orderTransfer));
83
84
        return $inxmailRequestTransfer;
85
    }
86
87
    /**
88
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
89
     *
90
     * @return array
91
     */
92
    protected function getPayload(OrderTransfer $orderTransfer): array
93
    {
94
        $locale = $orderTransfer->getCustomer()->getLocale() ?
95
            $orderTransfer->getCustomer()->getLocale()->getLocaleName() :
96
            $this->localeFacade->getCurrentLocaleName();
97
98
        $payload = [
99
            'Customer' => [
100
                'Mail' => $orderTransfer->getCustomer()->getEmail(),
101
                'Salutation' => $orderTransfer->getCustomer()->getSalutation(),
102
                'Firstname' => $orderTransfer->getCustomer()->getFirstName(),
103
                'Lastname' => $orderTransfer->getCustomer()->getLastName(),
104
                'Id' => $orderTransfer->getCustomer()->getIdCustomer(),
105
                'Language' => $locale,
106
            ],
107
            'Billing' => [
108
                'Salutation' => $orderTransfer->getBillingAddress()->getSalutation(),
109
                'Firstname' => $orderTransfer->getBillingAddress()->getFirstName(),
110
                'Lastname' => $orderTransfer->getBillingAddress()->getLastName(),
111
                'Company' => $orderTransfer->getBillingAddress()->getCompany(),
112
                'Address1' => $orderTransfer->getBillingAddress()->getAddress1(),
113
                'Address2' => $orderTransfer->getBillingAddress()->getAddress2(),
114
                'Address3' => $orderTransfer->getBillingAddress()->getAddress3(),
115
                'City' => $orderTransfer->getBillingAddress()->getCity(),
116
                'Zip' => $orderTransfer->getBillingAddress()->getZipCode(),
117
                'Country' => $orderTransfer->getBillingAddress()->getCountry()->getName(),
118
            ],
119
            'Shipping' => [
120
                'Salutation' => $orderTransfer->getShippingAddress()->getSalutation(),
121
                'Firstname' => $orderTransfer->getShippingAddress()->getFirstName(),
122
                'Lastname' => $orderTransfer->getShippingAddress()->getLastName(),
123
                'Company' => $orderTransfer->getShippingAddress()->getCompany(),
124
                'Address1' => $orderTransfer->getShippingAddress()->getAddress1(),
125
                'Address2' => $orderTransfer->getShippingAddress()->getAddress2(),
126
                'Address3' => $orderTransfer->getShippingAddress()->getAddress3(),
127
                'City' => $orderTransfer->getShippingAddress()->getCity(),
128
                'Zip' => $orderTransfer->getShippingAddress()->getZipCode(),
129
                'Country' => $orderTransfer->getShippingAddress()->getCountry()->getName(),
130
            ],
131
            'Order' => [
132
                'Number' => $orderTransfer->getIdSalesOrder(),
133
                'Comment' => $orderTransfer->getCartNote(),
134
                'CancelComment' => '',
135
                'OrderDate' => $this->dateTimeService->formatDateTime($orderTransfer->getCreatedAt()),
136
                'SubTotal' => $this->getFormattedPriceFromInt($orderTransfer->getTotals()->getSubtotal()),
137
                'Discount' => $this->getFormattedPriceFromInt($orderTransfer->getTotals()->getDiscountTotal()),
138
                'Tax' => $this->getFormattedPriceFromInt($orderTransfer->getTotals()->getTaxTotal()->getAmount()),
139
                'GrandTotal' => $this->getFormattedPriceFromInt($orderTransfer->getTotals()->getGrandTotal()),
140
                'TotalDeliveryCosts' => $this->getDeliveryCosts($orderTransfer->getExpenses()),
141
                'TotalPaymentCosts' => $this->getPaymentMethodsTotal($orderTransfer->getPayments()),
142
            ],
143
            'Payment' => $this->getPaymentMethodInfo($orderTransfer->getPayments()),
144
            'Delivery' => $this->getOrderDeliveryInfo($orderTransfer->getShipmentMethods(), $orderTransfer->getExpenses()),
145
            'Shop' => [
146
                'ShopLocale' => $this->localeFacade->getCurrentLocaleName(),
147
                'ShopUrl' => $this->config->getHostYves(),
148
            ],
149
        ];
150
151
        foreach ($orderTransfer->getItems() as $item) {
152
            $payload['OrderItem'][] = [
153
                'Name' => $item->getName(),
154
                'Sku' => $item->getSku(),
155
                'Image' => $this->getItemImageLink($item->getImages()),
156
                'DeepLink' => $this->getDeepLink($item, $locale),
157
                'Price' => $this->getFormattedPriceFromInt($item->getRefundableAmount()),
158
                'Quantity' => $item->getQuantity(),
159
                'Sum' => $this->getFormattedPriceFromInt($item->getSumPriceToPayAggregation()),
160
                'OriginalPrice' => $this->getFormattedPriceFromInt($item->getUnitPrice()),
161
                'TaxAmount' => $this->getFormattedPriceFromInt($item->getUnitTaxAmount()),
162
                'TaxRate' => $item->getTaxRate(),
163
                'Discount' => $this->getFormattedPriceFromInt($item->getUnitDiscountAmountAggregation()),
164
            ];
165
        }
166
167
        return $payload;
168
    }
169
170
    /**
171
     * @return string
172
     */
173
    abstract protected function getEvent(): string;
174
175
    /**
176
     * @param \ArrayObject $images
177
     *
178
     * @return string
179
     */
180
    protected function getItemImageLink(ArrayObject $images): string
181
    {
182
        /**
183
         * @var \Generated\Shared\Transfer\ProductImageTransfer $image
184
         */
185
        foreach ($images as $image) {
186
            return $image->getExternalUrlSmall();
187
        }
188
189
        return '';
190
    }
191
192
    /**
193
     * @param \ArrayObject $methods
194
     * @param \ArrayObject $expenses
195
     *
196
     * @return array
197
     */
198
    protected function getOrderDeliveryInfo(ArrayObject $methods, ArrayObject $expenses): array
199
    {
200
        $result = [];
201
202
        /**
203
         * @var \Generated\Shared\Transfer\ShipmentMethodTransfer $method
204
         */
205
        foreach ($methods as $method) {
206
            $result[] = [
207
                'DeliveryMethod' => $method->getName(),
208
                'DeliveryService' => $method->getCarrierName(),
209
                'DeliveryCosts' => $this->getDeliveryCosts($expenses),
210
                'ShippingDate' => $this->dateTimeService->formatDateTime((new DateTime())::createFromFormat('U', $method->getDeliveryTime())),
211
                'MultiDelivery' => 'No',
212
            ];
213
        }
214
215
        return $result;
216
    }
217
218
    /**
219
     * @param \ArrayObject $methods
220
     *
221
     * @return array
222
     */
223
    protected function getPaymentMethodInfo(ArrayObject $methods): array
224
    {
225
        $result = [];
226
227
        foreach ($methods as $method) {
228
            $result[] = [
229
                'PaymentMethod' => $method->getPaymentMethod(),
230
                'PaymentMethodCosts' => $this->getFormattedPriceFromInt($method->getAmount()),
231
                'CheckDate' => $this->dateTimeService->formatDateTime(new DateTime()),
232
            ];
233
        }
234
235
        return $result;
236
    }
237
238
    /**
239
     * @param \ArrayObject $methods
240
     *
241
     * @return string
242
     */
243
    protected function getPaymentMethodsTotal(ArrayObject $methods): string
244
    {
245
        $sum = 0;
246
247
        /**
248
         * @var \Generated\Shared\Transfer\PaymentTransfer $method
249
         */
250
        foreach ($methods as $method) {
251
            $sum += $method->getAmount();
252
        }
253
254
        return $this->getFormattedPriceFromInt($sum);
255
    }
256
257
    /**
258
     * @param int $value
259
     *
260
     * @return string
261
     */
262
    protected function getFormattedPriceFromInt(int $value): string
263
    {
264
        $moneyTransfer = $this->moneyFacade->fromInteger($value);
265
266
        return $this->moneyFacade->formatWithSymbol($moneyTransfer);
267
    }
268
269
    /**
270
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
271
     * @param string $locale
272
     *
273
     * @return string
274
     */
275
    protected function getDeepLink(ItemTransfer $itemTransfer, string $locale): string
276
    {
277
        $transfer = new ProductAbstractTransfer();
278
        $transfer->setIdProductAbstract($itemTransfer->getIdProductAbstract());
279
        $transfer->setSku($itemTransfer->getSku());
280
281
        $urls = $this->productFacade->getProductUrl($transfer)->getUrls();
282
        foreach ($urls as $url) {
283
            if ($url->getLocale() === $locale) {
284
                return $this->config->getHostYves() . $url->getUrl();
285
            }
286
        }
287
288
        return $this->config->getHostYves() . $urls->offsetGet(0)->getUrl();
289
    }
290
291
    /**
292
     * @param \ArrayObject $expenses
293
     *
294
     * @return string
295
     */
296
    protected function getDeliveryCosts(ArrayObject $expenses): string
297
    {
298
        foreach ($expenses as $expense) {
299
            if ($expense->getType() === static::SHIPMENT_EXPENSE_TYPE) {
300
                return $this->getFormattedPriceFromInt($expense->getSumGrossPrice());
301
            }
302
        }
303
304
        return $this->getFormattedPriceFromInt(0);
305
    }
306
}
307