1 | <?php |
||||||
2 | |||||||
3 | /** |
||||||
4 | * PAYONE Magento 2 Connector is free software: you can redistribute it and/or modify |
||||||
5 | * it under the terms of the GNU Lesser General Public License as published by |
||||||
6 | * the Free Software Foundation, either version 3 of the License, or |
||||||
7 | * (at your option) any later version. |
||||||
8 | * |
||||||
9 | * PAYONE Magento 2 Connector is distributed in the hope that it will be useful, |
||||||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
12 | * GNU Lesser General Public License for more details. |
||||||
13 | * |
||||||
14 | * You should have received a copy of the GNU Lesser General Public License |
||||||
15 | * along with PAYONE Magento 2 Connector. If not, see <http://www.gnu.org/licenses/>. |
||||||
16 | * |
||||||
17 | * PHP version 5 |
||||||
18 | * |
||||||
19 | * @category Payone |
||||||
20 | * @package Payone_Magento2_Plugin |
||||||
21 | * @author FATCHIP GmbH <[email protected]> |
||||||
22 | * @copyright 2003 - 2016 Payone GmbH |
||||||
23 | * @license <http://www.gnu.org/licenses/> GNU Lesser General Public License |
||||||
24 | * @link http://www.payone.de |
||||||
25 | */ |
||||||
26 | |||||||
27 | namespace Payone\Core\Model\Api; |
||||||
28 | |||||||
29 | use Payone\Core\Model\Api\Request\Base; |
||||||
30 | use Magento\Sales\Model\Order; |
||||||
0 ignored issues
–
show
|
|||||||
31 | use Magento\Quote\Model\Quote\Item as QuoteItem; |
||||||
0 ignored issues
–
show
The type
Magento\Quote\Model\Quote\Item 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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
32 | use Magento\Quote\Model\Quote; |
||||||
0 ignored issues
–
show
The type
Magento\Quote\Model\Quote 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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
33 | |||||||
34 | /** |
||||||
35 | * Collect all invoice parameters |
||||||
36 | * |
||||||
37 | * @category Payone |
||||||
38 | * @package Payone_Magento2_Plugin |
||||||
39 | * @author FATCHIP GmbH <[email protected]> |
||||||
40 | * @copyright 2003 - 2016 Payone GmbH |
||||||
41 | * @license <http://www.gnu.org/licenses/> GNU Lesser General Public License |
||||||
42 | * @link http://www.payone.de |
||||||
43 | */ |
||||||
44 | class Invoice |
||||||
45 | { |
||||||
46 | /** |
||||||
47 | * Index of added invoice items |
||||||
48 | * |
||||||
49 | * @var integer |
||||||
50 | */ |
||||||
51 | protected $iIndex = 1; |
||||||
52 | |||||||
53 | /** |
||||||
54 | * Invoice amount |
||||||
55 | * |
||||||
56 | * @var integer |
||||||
57 | */ |
||||||
58 | protected $dAmount = 0; |
||||||
59 | |||||||
60 | /** |
||||||
61 | * Vat rate for following entities which may not have the vat attached to it |
||||||
62 | * |
||||||
63 | * @var double |
||||||
64 | */ |
||||||
65 | protected $dTax = false; |
||||||
66 | |||||||
67 | /** |
||||||
68 | * PAYONE toolkit helper |
||||||
69 | * |
||||||
70 | * @var \Payone\Core\Helper\Toolkit |
||||||
71 | */ |
||||||
72 | protected $toolkitHelper; |
||||||
73 | |||||||
74 | /** |
||||||
75 | * PAYONE amasty helper |
||||||
76 | * |
||||||
77 | * @var \Payone\Core\Helper\AmastyGiftcard |
||||||
78 | */ |
||||||
79 | protected $amastyHelper; |
||||||
80 | |||||||
81 | /** |
||||||
82 | * @var \Magento\Framework\Pricing\PriceCurrencyInterface |
||||||
0 ignored issues
–
show
The type
Magento\Framework\Pricing\PriceCurrencyInterface 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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
83 | */ |
||||||
84 | protected $priceCurrency; |
||||||
85 | |||||||
86 | /** |
||||||
87 | * Request object |
||||||
88 | * |
||||||
89 | * @var Base |
||||||
90 | */ |
||||||
91 | protected $oRequest; |
||||||
92 | |||||||
93 | /** |
||||||
94 | * Current store code |
||||||
95 | * |
||||||
96 | * @var string |
||||||
97 | */ |
||||||
98 | protected $sStoreCode; |
||||||
99 | |||||||
100 | /** |
||||||
101 | * Determines if price has to be negated |
||||||
102 | * |
||||||
103 | * @var bool |
||||||
104 | */ |
||||||
105 | protected $blNegatePrice = false; |
||||||
106 | |||||||
107 | /** |
||||||
108 | * Determines if product category url has to be send |
||||||
109 | * |
||||||
110 | * @var bool |
||||||
111 | */ |
||||||
112 | protected $blSendCategoryUrl = false; |
||||||
113 | |||||||
114 | /** |
||||||
115 | * Constructor |
||||||
116 | * |
||||||
117 | * @param \Payone\Core\Helper\Toolkit $toolkitHelper |
||||||
118 | * @param \Payone\Core\Helper\AmastyGiftcard $amastyHelper |
||||||
119 | * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency |
||||||
120 | */ |
||||||
121 | public function __construct( |
||||||
122 | \Payone\Core\Helper\Toolkit $toolkitHelper, |
||||||
123 | \Payone\Core\Helper\AmastyGiftcard $amastyHelper, |
||||||
124 | \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency |
||||||
125 | ) { |
||||||
126 | $this->toolkitHelper = $toolkitHelper; |
||||||
127 | $this->amastyHelper = $amastyHelper; |
||||||
128 | $this->priceCurrency = $priceCurrency; |
||||||
129 | } |
||||||
130 | |||||||
131 | /** |
||||||
132 | * @param bool $blNegatePrice |
||||||
133 | */ |
||||||
134 | public function setNegatePrice($blNegatePrice) |
||||||
135 | { |
||||||
136 | $this->blNegatePrice = $blNegatePrice; |
||||||
137 | } |
||||||
138 | |||||||
139 | /** |
||||||
140 | * @param bool $blSendCategoryUrl |
||||||
141 | */ |
||||||
142 | public function setSendCategoryUrl($blSendCategoryUrl) |
||||||
143 | { |
||||||
144 | $this->blSendCategoryUrl = $blSendCategoryUrl; |
||||||
145 | } |
||||||
146 | |||||||
147 | /** |
||||||
148 | * Add parameters for a invoice position |
||||||
149 | * |
||||||
150 | * @param string $sId item identification |
||||||
151 | * @param double $dPrice item price |
||||||
152 | * @param string $sItemType item type |
||||||
153 | * @param int $iAmount item amount |
||||||
154 | * @param string $sDesc item description |
||||||
155 | * @param double $dVat item tax rate |
||||||
156 | * @param string $sCategoryUrl category url |
||||||
157 | * @return void |
||||||
158 | */ |
||||||
159 | protected function addInvoicePosition($sId, $dPrice, $sItemType, $iAmount, $sDesc, $dVat, $sCategoryUrl = false) |
||||||
160 | { |
||||||
161 | $iMultiplier = 1; |
||||||
162 | if ($this->blNegatePrice === true) { |
||||||
163 | $iMultiplier = -1; |
||||||
164 | } |
||||||
165 | $this->oRequest->addParameter('id['.$this->iIndex.']', $this->formatSku($sId)); // add invoice item id |
||||||
166 | $this->oRequest->addParameter('pr['.$this->iIndex.']', $this->toolkitHelper->formatNumber($dPrice) * 100 * $iMultiplier); // expected in smallest unit of currency |
||||||
167 | $this->oRequest->addParameter('it['.$this->iIndex.']', $sItemType); // add invoice item type |
||||||
168 | $this->oRequest->addParameter('no['.$this->iIndex.']', $iAmount); // add invoice item amount |
||||||
169 | $this->oRequest->addParameter('de['.$this->iIndex.']', $sDesc); // add invoice item description |
||||||
170 | $this->oRequest->addParameter('va['.$this->iIndex.']', $this->toolkitHelper->formatNumber($dVat * 100, 0)); // expected * 100 to also handle vats with decimals |
||||||
171 | if ($sCategoryUrl !== false) { |
||||||
172 | $this->oRequest->addParameter('add_paydata[category_path_'.$sId.']', $sCategoryUrl); // add category url of a product, needed for BNPL payment methods |
||||||
173 | } |
||||||
174 | $this->dAmount += $dPrice * $iAmount; // needed for return of the main method |
||||||
175 | $this->iIndex++; // increase index for next item |
||||||
176 | } |
||||||
177 | |||||||
178 | /** |
||||||
179 | * Add invoicing data to the request and return the summed invoicing amount |
||||||
180 | * |
||||||
181 | * @param Base $oRequest Request object |
||||||
182 | * @param object $oOrder Order object |
||||||
183 | * @param array $aPositions Is given with non-complete captures or debits |
||||||
184 | * @param bool $blDebit Is the call coming from a debit request |
||||||
185 | * @param double $dShippingCosts Shipping costs - needed for Klarna start_session |
||||||
186 | * @return integer |
||||||
187 | */ |
||||||
188 | public function addProductInfo(Base $oRequest, $oOrder, $aPositions = false, $blDebit = false, $dShippingCosts = false) |
||||||
189 | { |
||||||
190 | $this->oRequest = $oRequest; // write request to property for manipulation of the object |
||||||
191 | $this->setStoreCode($oOrder->getStore()->getCode()); |
||||||
192 | if ($oOrder instanceof Order) { |
||||||
193 | $sInvoiceAppendix = $this->toolkitHelper->getInvoiceAppendix($oOrder); // get invoice appendix |
||||||
194 | if (!empty($sInvoiceAppendix)) { // invoice appendix existing? |
||||||
195 | $this->oRequest->addParameter('invoiceappendix', $sInvoiceAppendix); // add appendix to request |
||||||
196 | } |
||||||
197 | } |
||||||
198 | |||||||
199 | $iQtyInvoiced = 0; |
||||||
200 | foreach ($oOrder->getAllItems() as $oItem) { // add invoice items for all order items |
||||||
201 | if (($oOrder instanceof Order && $oItem->isDummy() === false) || ($oOrder instanceof Quote && $oItem->getParentItemId() === null)) { // prevent variant-products of adding 2 items |
||||||
202 | $this->addProductItem($oItem, $aPositions); // add product invoice params to request |
||||||
0 ignored issues
–
show
It seems like
$aPositions can also be of type false ; however, parameter $aPositions of Payone\Core\Model\Api\Invoice::addProductItem() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
203 | } |
||||||
204 | $iQtyInvoiced += $oItem->getOrigData('qty_invoiced'); // get data pre-capture |
||||||
205 | } |
||||||
206 | |||||||
207 | $blFirstCapture = true; // Is first capture? |
||||||
208 | if ($iQtyInvoiced > 0) { |
||||||
209 | $blFirstCapture = false; |
||||||
210 | } |
||||||
211 | |||||||
212 | if ($aPositions === false || $blFirstCapture === true || $blDebit === true) { |
||||||
213 | $this->addShippingItem($oOrder, $aPositions, $blDebit, $dShippingCosts); // add shipping invoice params to request |
||||||
0 ignored issues
–
show
It seems like
$aPositions can also be of type false ; however, parameter $aPositions of Payone\Core\Model\Api\Invoice::addShippingItem() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() It seems like
$dShippingCosts can also be of type false ; however, parameter $dShippingCosts of Payone\Core\Model\Api\Invoice::addShippingItem() does only seem to accept double , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
214 | $this->addGiftCardItem($oOrder); // add gift card invoice params to request |
||||||
215 | $this->addAmastyGiftcards($oOrder, $aPositions, $blDebit); // add amasty giftcard invoice params to request |
||||||
0 ignored issues
–
show
It seems like
$aPositions can also be of type false ; however, parameter $aPositions of Payone\Core\Model\Api\In...e::addAmastyGiftcards() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
216 | } |
||||||
217 | $this->addDiscountItem($oOrder, $aPositions, $blDebit); // add discount invoice params to request |
||||||
0 ignored issues
–
show
It seems like
$aPositions can also be of type false ; however, parameter $aPositions of Payone\Core\Model\Api\Invoice::addDiscountItem() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
218 | |||||||
219 | return $this->dAmount; |
||||||
220 | } |
||||||
221 | |||||||
222 | /** |
||||||
223 | * Add invoicing item for a product |
||||||
224 | * |
||||||
225 | * @param \Magento\Sales\Model\Order\Item $oItem |
||||||
0 ignored issues
–
show
The type
Magento\Sales\Model\Order\Item 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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
226 | * @param array $aPositions |
||||||
227 | * @return void |
||||||
228 | */ |
||||||
229 | protected function addProductItem($oItem, $aPositions) |
||||||
230 | { |
||||||
231 | $sPositionKey = $oItem->getProductId().$oItem->getSku(); |
||||||
232 | if ($aPositions === false || array_key_exists($sPositionKey, $aPositions) !== false) { // full or single-invoice? |
||||||
233 | $dItemAmount = $oItem->getQtyOrdered(); // get ordered item amount |
||||||
234 | if ($oItem instanceof QuoteItem) { |
||||||
235 | $dItemAmount = $oItem->getQty(); |
||||||
236 | } |
||||||
237 | if ($aPositions !== false && array_key_exists($sPositionKey, $aPositions) !== false) { // product existing in single-invoice? |
||||||
238 | $dItemAmount = $aPositions[$sPositionKey]; // use amount from single-invoice |
||||||
239 | } |
||||||
240 | $iAmount = $this->convertItemAmount($dItemAmount); |
||||||
241 | $dPrice = $oItem->getBasePriceInclTax(); |
||||||
242 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
243 | $dPrice = $oItem->getPriceInclTax(); |
||||||
244 | } |
||||||
245 | |||||||
246 | $sCategoryUrl = false; |
||||||
247 | if ($this->blSendCategoryUrl === true) { |
||||||
248 | $oCategory = $this->getProductCategory($oItem); |
||||||
249 | if (!empty($oCategory) && !empty($oCategory->getUrl())) { |
||||||
250 | $sCategoryUrl = $oCategory->getUrl(); |
||||||
251 | } |
||||||
252 | } |
||||||
253 | |||||||
254 | $this->addInvoicePosition($oItem->getSku(), $dPrice, 'goods', $iAmount, $oItem->getName(), $oItem->getTaxPercent(), $sCategoryUrl); // add invoice params to request |
||||||
255 | if ($this->dTax === false) { // is dTax not set yet? |
||||||
0 ignored issues
–
show
|
|||||||
256 | $this->dTax = $oItem->getTaxPercent(); // set the tax for following entities which dont have the vat attached to it |
||||||
257 | } |
||||||
258 | } |
||||||
259 | } |
||||||
260 | |||||||
261 | /** |
||||||
262 | * Try to get a category from given order item |
||||||
263 | * |
||||||
264 | * @param \Magento\Sales\Model\Order\Item $oItem |
||||||
265 | * @return \Magento\Catalog\Model\Category|false |
||||||
0 ignored issues
–
show
The type
Magento\Catalog\Model\Category 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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
266 | */ |
||||||
267 | protected function getProductCategory($oItem) |
||||||
268 | { |
||||||
269 | $oProduct = $oItem->getProduct(); |
||||||
270 | if ($oProduct) { |
||||||
271 | $oCategoryCollection = $oProduct->getCategoryCollection(); |
||||||
272 | if (count($oCategoryCollection) > 0) { |
||||||
273 | $oCategory = $oCategoryCollection->getFirstItem(); |
||||||
274 | if ($oCategory) { |
||||||
275 | return $oCategory; |
||||||
276 | } |
||||||
277 | } |
||||||
278 | } |
||||||
279 | return false; |
||||||
280 | } |
||||||
281 | |||||||
282 | protected function addGiftCardItem($oOrder) |
||||||
283 | { |
||||||
284 | $giftCards = json_decode($oOrder->getData('gift_cards') ?? '', true); |
||||||
285 | |||||||
286 | if(empty($giftCards) || !is_array($giftCards)) { |
||||||
287 | return; |
||||||
288 | } |
||||||
289 | |||||||
290 | foreach($giftCards as $giftCard) { |
||||||
291 | $giftCardAmount = $this->getGiftCardAmount($giftCard); |
||||||
292 | $this->addInvoicePosition($giftCard['c'], $giftCardAmount, 'voucher', 1, 'Giftcard', 0); |
||||||
293 | } |
||||||
294 | } |
||||||
295 | |||||||
296 | /** |
||||||
297 | * return giftcard-amount based on magento version |
||||||
298 | * |
||||||
299 | * @param $aGiftCard |
||||||
300 | * @return |
||||||
301 | */ |
||||||
302 | private function getGiftCardAmount($aGiftCard) |
||||||
303 | { |
||||||
304 | // up to Magento 2.3.4 giftcard-amount is saved in 'authorized', again in 2.4 |
||||||
305 | if (array_key_exists('authorized', $aGiftCard)) { |
||||||
306 | return -$aGiftCard['authorized']; |
||||||
307 | } |
||||||
308 | // in Magento 2.3.5 the array has slightly changed, giftcard-amount is only saved in 'ba' |
||||||
309 | if (array_key_exists('ba', $aGiftCard)) { |
||||||
310 | return -$aGiftCard['ba']; |
||||||
311 | } |
||||||
312 | return 0; |
||||||
313 | } |
||||||
314 | |||||||
315 | /** |
||||||
316 | * Add invoicing item for shipping |
||||||
317 | * |
||||||
318 | * @param Order $oOrder |
||||||
319 | * @param array $aPositions |
||||||
320 | * @param bool $blDebit |
||||||
321 | * @param double $dShippingCosts |
||||||
322 | * @return void |
||||||
323 | */ |
||||||
324 | protected function addShippingItem($oOrder, $aPositions, $blDebit, $dShippingCosts = false) |
||||||
325 | { |
||||||
326 | $dPrice = $dShippingCosts; |
||||||
327 | if ($dPrice === false) { |
||||||
328 | $dPrice = $oOrder->getBaseShippingInclTax(); |
||||||
329 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
330 | $dPrice = $oOrder->getShippingInclTax(); |
||||||
331 | } |
||||||
332 | } |
||||||
333 | |||||||
334 | if ($oOrder instanceof Quote && ($dPrice === false || $dPrice === null) && !empty($oOrder->getShippingAddress()->getShippingMethod())) { |
||||||
335 | $sShippingMethod = $oOrder->getShippingAddress()->getShippingMethod(); |
||||||
336 | |||||||
337 | $oShippingAddress = $oOrder->getShippingAddress(); |
||||||
338 | $oShippingAddress->setCollectShippingRates(true); |
||||||
339 | $oShippingAddress->collectShippingRates(); |
||||||
340 | $aShippingRates = $oShippingAddress->getGroupedAllShippingRates(); |
||||||
341 | |||||||
342 | foreach ($aShippingRates as $aCarrierRates) { |
||||||
343 | foreach ($aCarrierRates as $oRate) { |
||||||
344 | if ($oRate->getCode() == $sShippingMethod) { |
||||||
345 | $dPrice = $oRate->getPrice(); // base price |
||||||
346 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
347 | $dPrice = $this->priceCurrency->convert($oRate->getPrice(), $oOrder->getStore()); // display price |
||||||
348 | } |
||||||
349 | } |
||||||
350 | } |
||||||
351 | } |
||||||
352 | } |
||||||
353 | |||||||
354 | // shipping costs existing or given for partial captures/debits? |
||||||
355 | if ($dPrice != 0 && ($aPositions === false || ($blDebit === false || array_key_exists('delcost', $aPositions) !== false))) { |
||||||
356 | if ($aPositions !== false && array_key_exists('delcost', $aPositions) !== false) { // product existing in single-invoice? |
||||||
357 | $dPrice = $aPositions['delcost']; |
||||||
358 | } |
||||||
359 | $sDelDesc = __('Surcharge').' '.__('Shipping Costs'); // default description |
||||||
0 ignored issues
–
show
The function
__ was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
360 | if ($dPrice < 0) { // negative shipping cost |
||||||
361 | $sDelDesc = __('Deduction').' '.__('Shipping Costs'); // change item description to deduction |
||||||
362 | } |
||||||
363 | $sShippingSku = $this->toolkitHelper->getConfigParam('sku', 'costs', 'payone_misc', $this->getStoreCode()); // get configured shipping SKU |
||||||
364 | $this->addInvoicePosition($sShippingSku, $dPrice, 'shipment', 1, $sDelDesc, $this->dTax); // add invoice params to request |
||||||
365 | } |
||||||
366 | } |
||||||
367 | |||||||
368 | /** |
||||||
369 | * Add invoicing item for discounts |
||||||
370 | * |
||||||
371 | * @param Order $oOrder |
||||||
372 | * @param array $aPositions |
||||||
373 | * @param bool $blDebit |
||||||
374 | * @return void |
||||||
375 | */ |
||||||
376 | protected function addDiscountItem($oOrder, $aPositions, $blDebit) |
||||||
377 | { |
||||||
378 | // discount costs existing or given for partial captures/debit? |
||||||
379 | $dTransmitDiscount = $oOrder->getBaseDiscountAmount(); |
||||||
380 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
381 | $dTransmitDiscount = $oOrder->getDiscountAmount(); |
||||||
382 | } |
||||||
383 | |||||||
384 | if ($oOrder instanceof Quote) { |
||||||
385 | $dTransmitDiscount = $oOrder->getBaseSubtotal() - $oOrder->getBaseSubtotalWithDiscount(); |
||||||
386 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
387 | $dTransmitDiscount = $oOrder->getSubtotal() - $oOrder->getSubtotalWithDiscount(); |
||||||
388 | } |
||||||
389 | } |
||||||
390 | |||||||
391 | if ($dTransmitDiscount != 0 && ($aPositions === false || ($blDebit === false || array_key_exists('discount', $aPositions) !== false))) { |
||||||
392 | if ($aPositions !== false && array_key_exists('discount', $aPositions) !== false) { |
||||||
393 | $dTransmitDiscount = $aPositions['discount']; |
||||||
394 | } |
||||||
395 | $dDiscount = $this->toolkitHelper->formatNumber($dTransmitDiscount); // format discount |
||||||
396 | if ($aPositions === false && $this->amastyHelper->hasAmastyGiftcards($oOrder->getQuoteId(), $oOrder) === false) { |
||||||
0 ignored issues
–
show
|
|||||||
397 | // The calculations broken down to single items of Magento2 are unprecise and the Payone API will send an error if |
||||||
398 | // the calculated positions don't match, so we compensate for rounding-problems here |
||||||
399 | $dTotal = $oOrder->getBaseGrandTotal(); |
||||||
400 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
401 | $dTotal = $oOrder->getGrandTotal(); |
||||||
402 | } |
||||||
403 | $dDiff = ($this->dAmount + $dTransmitDiscount - $dTotal); // calc rounding discrepancy |
||||||
404 | $dDiscount -= $dDiff; // subtract difference from discount |
||||||
405 | } |
||||||
406 | $sDiscountSku = $this->toolkitHelper->getConfigParam('sku', 'discount', 'payone_misc', $this->getStoreCode()); // get configured discount SKU |
||||||
407 | $sDesc = (string)__('Discount'); // default description |
||||||
0 ignored issues
–
show
The function
__ was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
408 | if ($oOrder->getCouponCode()) {// was a coupon code used? |
||||||
409 | $sDiscountSku = $this->toolkitHelper->getConfigParam('sku', 'voucher', 'payone_misc', $this->getStoreCode()); // get configured voucher SKU |
||||||
410 | $sDesc = (string)__('Coupon').' - '.$oOrder->getCouponCode(); // add counpon code to description |
||||||
411 | } |
||||||
412 | $this->addInvoicePosition($sDiscountSku, $dDiscount, 'voucher', 1, $sDesc, $this->dTax); // add invoice params to request |
||||||
0 ignored issues
–
show
$dDiscount of type string is incompatible with the type double expected by parameter $dPrice of Payone\Core\Model\Api\In...e::addInvoicePosition() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
413 | } |
||||||
414 | } |
||||||
415 | |||||||
416 | /** |
||||||
417 | * Adding amasty giftcards to request |
||||||
418 | * |
||||||
419 | * @param Order $oOrder |
||||||
420 | * @param array $aPositions |
||||||
421 | * @param bool $blDebit |
||||||
422 | * @return void |
||||||
423 | */ |
||||||
424 | protected function addAmastyGiftcards($oOrder, $aPositions, $blDebit) |
||||||
425 | { |
||||||
426 | $aGiftCards = $this->amastyHelper->getAmastyGiftCards($oOrder->getQuoteId(), $oOrder); |
||||||
427 | for ($i = 0; $i < count($aGiftCards); $i++) { |
||||||
0 ignored issues
–
show
It seems like you are calling the size function
count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}
// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
![]() |
|||||||
428 | $aGiftCard = $aGiftCards[$i]; |
||||||
429 | $blIsLastGiftcard = false; |
||||||
430 | if ($i + 1 == count($aGiftCards)) { |
||||||
431 | $blIsLastGiftcard = true; |
||||||
432 | } |
||||||
433 | |||||||
434 | $dTransmitDiscount = $aGiftCard['base_gift_amount']; |
||||||
435 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
436 | $dTransmitDiscount = $aGiftCard['gift_amount']; |
||||||
437 | } |
||||||
438 | if ($dTransmitDiscount != 0 && ($aPositions === false || ($blDebit === false || array_key_exists('discount', $aPositions) !== false))) { |
||||||
439 | $dTransmitDiscount = $dTransmitDiscount * -1; |
||||||
440 | $dDiscount = $this->toolkitHelper->formatNumber($dTransmitDiscount); // format discount |
||||||
441 | if ($aPositions === false && $blIsLastGiftcard === true) { |
||||||
442 | // The calculations broken down to single items of Magento2 are unprecise and the Payone API will send an error if |
||||||
443 | // the calculated positions don't match, so we compensate for rounding-problems here |
||||||
444 | $dTotal = $oOrder->getBaseGrandTotal(); |
||||||
445 | if ($this->toolkitHelper->getConfigParam('currency', 'global', 'payone_general', $this->getStoreCode()) == 'display') { |
||||||
446 | $dTotal = $oOrder->getGrandTotal(); |
||||||
447 | } |
||||||
448 | $dDiff = ($this->dAmount + $dTransmitDiscount - $dTotal); // calc rounding discrepancy |
||||||
449 | $dDiscount -= $dDiff; // subtract difference from discount |
||||||
450 | } |
||||||
451 | |||||||
452 | if ($dDiscount != 0) { |
||||||
453 | $sDiscountSku = $this->toolkitHelper->getConfigParam('sku', 'voucher', 'payone_misc', $this->getStoreCode()); // get configured voucher SKU |
||||||
454 | $sDesc = (string)__('Amasty Coupon'); |
||||||
0 ignored issues
–
show
The function
__ was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
455 | $this->addInvoicePosition($sDiscountSku, $dDiscount, 'voucher', 1, $sDesc, $this->dTax); // add invoice params to request |
||||||
0 ignored issues
–
show
$dDiscount of type string is incompatible with the type double expected by parameter $dPrice of Payone\Core\Model\Api\In...e::addInvoicePosition() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
456 | } |
||||||
457 | } |
||||||
458 | } |
||||||
459 | } |
||||||
460 | |||||||
461 | /** |
||||||
462 | * Check if item amount has decimal places |
||||||
463 | * Throw exception if given amount is no integer |
||||||
464 | * |
||||||
465 | * @param double $dItemAmount |
||||||
466 | * @throws \InvalidArgumentException |
||||||
467 | * @return int |
||||||
468 | */ |
||||||
469 | protected function convertItemAmount($dItemAmount) |
||||||
470 | { |
||||||
471 | if (fmod(floatval($dItemAmount), 1.0) > 0) { // input does not represent an integer |
||||||
472 | $sErrorMessage = "Unable to use floating point values for item amounts! Parameter was: "; |
||||||
473 | throw new \InvalidArgumentException($sErrorMessage . strval($dItemAmount), 1); |
||||||
474 | } else { // return the integer value |
||||||
475 | return intval($dItemAmount); |
||||||
476 | } |
||||||
477 | } |
||||||
478 | |||||||
479 | /** |
||||||
480 | * Set store code |
||||||
481 | * |
||||||
482 | * @param $sStoreCode |
||||||
483 | * @return void |
||||||
484 | */ |
||||||
485 | protected function setStoreCode($sStoreCode) |
||||||
486 | { |
||||||
487 | $this->sStoreCode = $sStoreCode; |
||||||
488 | } |
||||||
489 | |||||||
490 | /** |
||||||
491 | * Returns store code |
||||||
492 | * |
||||||
493 | * @return string |
||||||
494 | */ |
||||||
495 | protected function getStoreCode() |
||||||
496 | { |
||||||
497 | return $this->sStoreCode; |
||||||
498 | } |
||||||
499 | |||||||
500 | /** |
||||||
501 | * Returns formatted sku |
||||||
502 | * |
||||||
503 | * @param string $sSku |
||||||
504 | * @return string |
||||||
505 | */ |
||||||
506 | protected function formatSku($sSku) |
||||||
507 | { |
||||||
508 | $sSku = str_replace(',', '', $sSku); // remove comma from sku |
||||||
509 | $sSku = substr($sSku, 0, 32); // limit sku to 32 chars |
||||||
510 | return $sSku; |
||||||
511 | } |
||||||
512 | } |
||||||
513 |
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:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths