Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PIPRES-460 Cart Line service refactoring initiation #1000

Draft
wants to merge 29 commits into
base: release-6.2.5
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
2804d01
initial cart service refactoring
GytisZum Oct 15, 2024
06ecefe
Merge branch 'master' of github.com:mollie/PrestaShop into PIPRES-460…
GytisZum Nov 25, 2024
f18909c
splitting into more services for the code readability
GytisZum Dec 3, 2024
6abac4e
[PIPRES-460] created new service
MarijusCoding Dec 20, 2024
10adc01
[PIPRES-460] updated phpdocs
MarijusCoding Dec 20, 2024
8b9a50a
[PIPRES-460] changed methods visibility, added via dependency injection
MarijusCoding Dec 20, 2024
1572072
[PIPRES-460] added service methods on main service
MarijusCoding Dec 20, 2024
d8843dc
[PIPRES-460] added LineUtility
MarijusCoding Dec 20, 2024
8566734
[PIPRES-460] updated LineUtility
MarijusCoding Dec 20, 2024
f038742
[PIPRES-460] refactor code
MarijusCoding Dec 20, 2024
b5384e3
[PIPRES-460] added RoundingUtility
MarijusCoding Dec 20, 2024
573dcfd
[PIPRES-460] added rounding method
MarijusCoding Dec 20, 2024
6952ef7
[PIPRES-460] alignment, comment styling
MarijusCoding Dec 20, 2024
f53e73c
[PIPRES-460] moved method to ArrayUtility
MarijusCoding Dec 20, 2024
ed95407
[PIPRES-460] renamed argument
MarijusCoding Dec 20, 2024
4f2686b
[PIPRES-460] cslint
MarijusCoding Dec 20, 2024
a678dea
[PIPRES-460] added return types
MarijusCoding Dec 20, 2024
43f63ba
[PIPRES-460] added RoundingUtility widely
MarijusCoding Dec 20, 2024
19865dc
Revert "[PIPRES-460] added RoundingUtility widely"
MarijusCoding Dec 20, 2024
62c57a7
[PIPRES-460] added RoundingUtility 1
MarijusCoding Dec 20, 2024
6ceba0f
[PIPRES-460] added RoundingUtility 2
MarijusCoding Dec 20, 2024
7a738c4
[PIPRES-460] added RoundingUtility 3
MarijusCoding Dec 20, 2024
91be923
[PIPRES-460] workaround and added RoundingUtility
MarijusCoding Dec 20, 2024
2588879
[PIPRES-460] fix phpstan
MarijusCoding Dec 20, 2024
a19c2bc
[PIPRES-460] fixed infinite loop
MarijusCoding Dec 20, 2024
7746cce
[PIPRES-460] removed round method from CartItemsService because of in…
MarijusCoding Dec 20, 2024
6438eb1
[PIPRES-460] optimized ternary if
MarijusCoding Dec 20, 2024
c91af88
[PIPRES-460] added types arguments
MarijusCoding Dec 20, 2024
ae4dec7
[PIPRES-460] cslint
MarijusCoding Dec 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions src/Service/CartLine/CartItemDiscountService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php
/**
* Mollie https://www.mollie.nl
*
* @author Mollie B.V. <[email protected]>
* @copyright Mollie B.V.
* @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
*
* @see https://github.com/mollie/PrestaShop
* @codingStandardsIgnoreStart
*/

namespace Mollie\Service\CartLine;

use Mollie\Config\Config;
use mollie\src\Utility\RoundingUtility;
use Mollie\Utility\NumberUtility;

if (!defined('_PS_VERSION_')) {
exit;
}

class CartItemDiscountService
{
/* @var RoundingUtility $roundingUtility */
private $roundingUtility;

public function __construct(RoundingUtility $roundingUtility)
{
$this->roundingUtility = $roundingUtility;
}

/**
* @param float $totalDiscounts
* @param array $orderLines
* @param float $remaining
*
* @return array
*/
public function addDiscountsToProductLines(float $totalDiscounts, array $orderLines, float $remaining): array
{
if ($totalDiscounts >= 0.01) {
$orderLines['discount'] = [
[
'name' => 'Discount',
'type' => 'discount',
'quantity' => 1,
'unitPrice' => -$this->roundingUtility->round($totalDiscounts, Config::API_ROUNDING_PRECISION),
'totalAmount' => -$this->roundingUtility->round($totalDiscounts, Config::API_ROUNDING_PRECISION),
'targetVat' => 0,
'category' => '',
],
];
$remaining = NumberUtility::plus($remaining, $totalDiscounts);
}

return [$orderLines, $remaining];
}
}
65 changes: 65 additions & 0 deletions src/Service/CartLine/CartItemPaymentFeeService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php
/**
* Mollie https://www.mollie.nl
*
* @author Mollie B.V. <[email protected]>
* @copyright Mollie B.V.
* @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
*
* @see https://github.com/mollie/PrestaShop
* @codingStandardsIgnoreStart
*/

namespace mollie\src\Service\CartLine;

use Mollie\Config\Config;
use Mollie\DTO\PaymentFeeData;
use Mollie\Service\LanguageService;
use mollie\src\Utility\RoundingUtility;
use Mollie\Utility\NumberUtility;

if (!defined('_PS_VERSION_')) {
exit;
}

class CartItemPaymentFeeService
{
/* @var LanguageService */
private $languageService;

/* @var RoundingUtility */
private $roundingUtility;

public function __construct(LanguageService $languageService, RoundingUtility $roundingUtility)
{
$this->languageService = $languageService;
$this->roundingUtility = $roundingUtility;
}

/**
* @param PaymentFeeData $paymentFeeData
* @param array $orderLines
*
* @return array
*/
public function addPaymentFeeLine(PaymentFeeData $paymentFeeData, array $orderLines): array
{
if (!$paymentFeeData->isActive()) {
return $orderLines;
}

$orderLines['surcharge'] = [
[
'name' => $this->languageService->lang('Payment fee'),
'sku' => Config::PAYMENT_FEE_SKU,
'quantity' => 1,
'unitPrice' => $this->roundingUtility->round($paymentFeeData->getPaymentFeeTaxIncl(), CONFIG::API_ROUNDING_PRECISION),
'totalAmount' => $this->roundingUtility->round($paymentFeeData->getPaymentFeeTaxIncl(), CONFIG::API_ROUNDING_PRECISION),
'vatAmount' => NumberUtility::minus($paymentFeeData->getPaymentFeeTaxIncl(), $paymentFeeData->getPaymentFeeTaxExcl()),
'vatRate' => $paymentFeeData->getTaxRate(),
],
];

return $orderLines;
}
}
93 changes: 93 additions & 0 deletions src/Service/CartLine/CartItemProductLinesService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php
/**
* Mollie https://www.mollie.nl
*
* @author Mollie B.V. <[email protected]>
* @copyright Mollie B.V.
* @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
*
* @see https://github.com/mollie/PrestaShop
* @codingStandardsIgnoreStart
*/

namespace Mollie\Service\CartLine;

use Mollie\Config\Config;
use mollie\src\Utility\RoundingUtility;
use Mollie\Utility\CalculationUtility;
use Mollie\Utility\NumberUtility;

if (!defined('_PS_VERSION_')) {
exit;
}

class CartItemProductLinesService
{
/* @var RoundingUtility $roundingUtility */
private $roundingUtility;

public function __construct(RoundingUtility $roundingUtility)
{
$this->roundingUtility = $roundingUtility;
}

/**
* @param int $vatRatePrecision
*
* @return array
*
* @throws \PrestaShop\Decimal\Exception\DivisionByZeroException
*/
public function fillProductLinesWithRemainingData(array $orderLines, int $vatRatePrecision): array
{
$roundingPrecision = CONFIG::API_ROUNDING_PRECISION;

foreach ($orderLines as $productHash => $aItem) {
$orderLines[$productHash] = array_map(function ($line) use ($roundingPrecision, $vatRatePrecision) {
$quantity = (int) $line['quantity'];
$targetVat = $line['targetVat'];
$unitPrice = $line['unitPrice'];
$unitPriceNoTax = $this->roundingUtility->round(CalculationUtility::getUnitPriceNoTax(
$line['unitPrice'],
$targetVat
),
$roundingPrecision
);

// Calculate VAT
$totalAmount = $line['totalAmount'];
$actualVatRate = 0;
if ($unitPriceNoTax > 0) {
$actualVatRate = $this->roundingUtility->round(
$vatAmount = CalculationUtility::getActualVatRate($unitPrice, $unitPriceNoTax, $quantity),
$vatRatePrecision
);
}
$vatRateWithPercentages = NumberUtility::plus($actualVatRate, 100);
$vatAmount = NumberUtility::times(
$totalAmount,
NumberUtility::divide($actualVatRate, $vatRateWithPercentages)
);

$newItem = [
'name' => $line['name'],
'category' => $line['category'],
'quantity' => (int) $quantity,
'unitPrice' => $this->roundingUtility->round($unitPrice, $roundingPrecision),
'totalAmount' => $this->roundingUtility->round($totalAmount, $roundingPrecision),
'vatRate' => $this->roundingUtility->round($actualVatRate, $roundingPrecision),
'vatAmount' => $this->roundingUtility->round($vatAmount, $roundingPrecision),
'product_url' => $line['product_url'] ?? null,
'image_url' => $line['image_url'] ?? null,
];
if (isset($line['sku'])) {
$newItem['sku'] = $line['sku'];
}

return $newItem;
}, $aItem);
}

return $orderLines;
}
}
63 changes: 63 additions & 0 deletions src/Service/CartLine/CartItemShippingLineService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php
/**
* Mollie https://www.mollie.nl
*
* @author Mollie B.V. <[email protected]>
* @copyright Mollie B.V.
* @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
*
* @see https://github.com/mollie/PrestaShop
* @codingStandardsIgnoreStart
*/

namespace Mollie\Service\CartLine;

use Mollie\Config\Config;
use Mollie\Service\LanguageService;
use mollie\src\Utility\RoundingUtility;

if (!defined('_PS_VERSION_')) {
exit;
}

class CartItemShippingLineService
{
/* @var LanguageService */
private $languageService;

/* @var RoundingUtility */
private $roundingUtility;

public function __construct(LanguageService $languageService, RoundingUtility $roundingUtility)
{
$this->languageService = $languageService;
$this->roundingUtility = $roundingUtility;
}

/**
* @param float $roundedShippingCost
* @param array $cartSummary
* @param array $orderLines
*
* @return array
*/
public function addShippingLine(float $roundedShippingCost, array $cartSummary, array $orderLines): array
{
if ($this->roundingUtility->round($roundedShippingCost, 2) > 0) {
$shippingVatRate = $this->roundingUtility->round(($cartSummary['total_shipping'] - $cartSummary['total_shipping_tax_exc']) / $cartSummary['total_shipping_tax_exc'] * 100, Config::API_ROUNDING_PRECISION);

$orderLines['shipping'] = [
[
'name' => $this->languageService->lang('Shipping'),
'quantity' => 1,
'unitPrice' => $this->roundingUtility->round($roundedShippingCost, Config::API_ROUNDING_PRECISION),
'totalAmount' => $this->roundingUtility->round($roundedShippingCost, Config::API_ROUNDING_PRECISION),
'vatAmount' => $this->roundingUtility->round($roundedShippingCost * $shippingVatRate / ($shippingVatRate + 100), Config::API_ROUNDING_PRECISION),
'vatRate' => $shippingVatRate,
],
];
}

return $orderLines;
}
}
73 changes: 73 additions & 0 deletions src/Service/CartLine/CartItemWrappingService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php
/**
* Mollie https://www.mollie.nl
*
* @author Mollie B.V. <[email protected]>
* @copyright Mollie B.V.
* @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
*
* @see https://github.com/mollie/PrestaShop
* @codingStandardsIgnoreStart
*/

namespace Mollie\Service\CartLine;

use Mollie\Config\Config;
use Mollie\Service\LanguageService;
use mollie\src\Utility\RoundingUtility;
use Mollie\Utility\CalculationUtility;

if (!defined('_PS_VERSION_')) {
exit;
}

class CartItemWrappingService
{
/**
* @var LanguageService
*/
private $languageService;

/* @var RoundingUtility */
private $roundingUtility;

public function __construct(LanguageService $languageService, RoundingUtility $roundingUtility)
{
$this->languageService = $languageService;
$this->roundingUtility = $roundingUtility;
}

/**
* @param float $wrappingPrice
* @param array $cartSummary
* @param int $vatRatePrecision
* @param array $orderLines
*
* @return array
*/
public function addWrappingLine(float $wrappingPrice, array $cartSummary, int $vatRatePrecision, array $orderLines): array
{
if (round($wrappingPrice, 2) > 0) {
$wrappingVatRate = $this->roundingUtility->round(
CalculationUtility::getActualVatRate(
$cartSummary['total_wrapping'],
$cartSummary['total_wrapping_tax_exc']
),
$vatRatePrecision
);

$orderLines['wrapping'] = [
[
'name' => $this->languageService->lang('Gift wrapping'),
'quantity' => 1,
'unitPrice' => $this->roundingUtility->round($wrappingPrice, Config::API_ROUNDING_PRECISION),
'totalAmount' => $this->roundingUtility->round($wrappingPrice, Config::API_ROUNDING_PRECISION),
'vatAmount' => $this->roundingUtility->round($wrappingPrice * $wrappingVatRate / ($wrappingVatRate + 100), Config::API_ROUNDING_PRECISION),
'vatRate' => $wrappingVatRate,
],
];
}

return $orderLines;
}
}
Loading
Loading