Current File : /var/www/prestashop/modules/ps_eventbus/src/Decorator/CustomPriceDecorator.php |
<?php
namespace PrestaShop\Module\PsEventbus\Decorator;
use PrestaShop\Module\PsEventbus\Service\SpecificPriceService;
class CustomPriceDecorator
{
/**
* @var \Context
*/
private $context;
/**
* @var SpecificPriceService
*/
private $priceService;
public function __construct(
\Context $context,
SpecificPriceService $priceService
) {
$this->context = $context;
$this->priceService = $priceService;
}
/**
* @param array<mixed> $specificPrices
*
* @return void
*/
public function decorateSpecificPrices(&$specificPrices)
{
foreach ($specificPrices as &$specificPrice) {
$this->addTotalPrice($specificPrice);
$this->setShopId($specificPrice);
$this->castPropertyValues($specificPrice);
}
}
/**
* @param array<mixed> $specificPrice
*
* @return void
*/
private function addTotalPrice(&$specificPrice)
{
$this->context->country = new \Country($specificPrice['id_country']);
$this->context->currency = new \Currency($specificPrice['id_currency']);
$specificPrice['price_tax_included'] = $this->priceService->getSpecificProductPrice(
$specificPrice['id_product'],
$specificPrice['id_product_attribute'],
$specificPrice['id_specific_price'],
true,
false,
$this->context
);
$specificPrice['price_tax_excluded'] = $this->priceService->getSpecificProductPrice(
$specificPrice['id_product'],
$specificPrice['id_product_attribute'],
$specificPrice['id_specific_price'],
false,
false,
$this->context
);
$specificPrice['sale_price_tax_incl'] = $this->priceService->getSpecificProductPrice(
$specificPrice['id_product'],
$specificPrice['id_product_attribute'],
$specificPrice['id_specific_price'],
true,
true,
$this->context
);
$specificPrice['sale_price_tax_excl'] = $this->priceService->getSpecificProductPrice(
$specificPrice['id_product'],
$specificPrice['id_product_attribute'],
$specificPrice['id_specific_price'],
false,
true,
$this->context
);
}
/**
* @param array<mixed> $specificPrice
*
* @return void
*/
private function castPropertyValues(&$specificPrice)
{
$specificPrice['id_specific_price'] = (int) $specificPrice['id_specific_price'];
$specificPrice['id_product'] = (int) $specificPrice['id_product'];
$specificPrice['id_shop'] = (int) $specificPrice['id_shop'];
$specificPrice['id_group'] = (int) $specificPrice['id_group'];
$specificPrice['id_shop_group'] = (int) $specificPrice['id_shop_group'];
$specificPrice['id_product_attribute'] = (int) $specificPrice['id_product_attribute'];
$specificPrice['price'] = (float) $specificPrice['price'];
$specificPrice['from_quantity'] = (int) $specificPrice['from_quantity'];
$specificPrice['reduction'] = (float) $specificPrice['reduction'];
$specificPrice['reduction_tax'] = (int) $specificPrice['reduction_tax'];
$specificPrice['id_currency'] = (int) $specificPrice['id_currency'];
$specificPrice['id_country'] = (int) $specificPrice['id_country'];
$specificPrice['id_customer'] = (int) $specificPrice['id_customer'];
$specificPrice['currency'] = $specificPrice['currency'] ?: 'ALL';
$specificPrice['country'] = $specificPrice['country'] ?: 'ALL';
$specificPrice['price_tax_included'] = (float) $specificPrice['price_tax_included'];
$specificPrice['price_tax_excluded'] = (float) $specificPrice['price_tax_excluded'];
$specificPrice['sale_price_tax_incl'] = (float) $specificPrice['sale_price_tax_incl'];
$specificPrice['sale_price_tax_excl'] = (float) $specificPrice['sale_price_tax_excl'];
if ($specificPrice['reduction_type'] === 'percentage') {
$specificPrice['discount_percentage'] = $specificPrice['reduction'] * 100;
$specificPrice['discount_value_tax_incl'] = 0.0;
$specificPrice['discount_value_tax_excl'] = 0.0;
} else {
$specificPrice['discount_percentage'] = 0;
$specificPrice['discount_value_tax_incl'] = $specificPrice['price_tax_included'] - $specificPrice['sale_price_tax_incl'];
$specificPrice['discount_value_tax_excl'] = $specificPrice['price_tax_excluded'] - $specificPrice['sale_price_tax_excl'];
}
}
/**
* @param array<mixed> $specificPrice
*
* @return void
*/
private function setShopId(&$specificPrice)
{
if ($this->context->shop === null) {
throw new \PrestaShopException('No shop context');
}
if ($specificPrice['id_shop']) {
$specificPrice['id_shop'] = $this->context->shop->id;
}
}
}