Files
kupshop/bundles/KupShop/SalesBundle/Util/SalesUtil.php
2025-08-02 16:30:27 +02:00

116 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
namespace KupShop\SalesBundle\Util;
use KupShop\KupShopBundle\Context\CurrencyContext;
use KupShop\KupShopBundle\Util\Contexts;
use KupShop\KupShopBundle\Util\Entity\EntityUtil;
use KupShop\KupShopBundle\Util\Price\Price;
use KupShop\KupShopBundle\Util\Price\TotalPrice;
use KupShop\SalesBundle\Entity\Sale;
use KupShop\SalesBundle\Entity\Wrapper\SaleItemWrapper;
use KupShop\SalesBundle\Entity\Wrapper\SaleWrapper;
use KupShop\SalesBundle\SaleList\SaleList;
use Query\Operator;
class SalesUtil
{
public function __construct(
protected readonly SaleList $saleList,
protected readonly EntityUtil $entityUtil,
) {
}
public static function wrapSales(Sale|array $sales): SaleWrapper|array
{
$resultAsArray = true;
if (!is_array($sales)) {
$sales = [$sales];
$resultAsArray = false;
}
foreach ($sales as &$sale) {
foreach ($sale->items as $key => $item) {
$sale->items[$key] = SaleItemWrapper::wrap($item);
}
$sale = SaleWrapper::wrap($sale);
}
return $resultAsArray ? $sales : reset($sales);
}
public static function prepareSale(array $data): array
{
$currencyContext = Contexts::get(CurrencyContext::class);
$data['language_id'] = $data['id_language'] ?? null;
$data['date_created'] = new \DateTimeImmutable($data['date_created']);
$data['total_price'] = new TotalPrice(
toDecimal($data['total_price']),
toDecimal($data['total_price_without_vat']),
$currencyContext->getOrDefault($data['currency'] ?? null)
);
$data['order_id'] = $data['id_order'];
$data['user_id'] = $data['id_user'];
$data['seller_id'] = $data['id_seller'];
$data['delivery_type_id'] = $data['id_delivery_type'];
$data['data'] = json_decode($data['data'] ?: '', true) ?: [];
$data['items'] = [];
return $data;
}
public static function prepareSaleItem(Sale $sale, array $data): array
{
$currencyContext = Contexts::get(CurrencyContext::class);
if (!empty($data['id_product'])) {
$productListKey = $data['id_product'];
if ($data['id_variation']) {
$productListKey .= '/'.$data['id_variation'];
}
$data['product'] = $sale->productCollection[$productListKey] ?? null;
}
$data['product_id'] = $data['id_product'];
$data['variation_id'] = $data['id_variation'];
$data['piece_price'] = new Price(
toDecimal($data['piece_price']),
$currencyContext->getOrDefault($sale->currency),
$data['tax']
);
$data['total_price'] = new Price(
toDecimal($data['total_price']),
$currencyContext->getOrDefault($sale->currency),
$data['tax']
);
$data['data'] = json_decode($data['data'] ?: '', true) ?: [];
return $data;
}
public function getSale(int $id): ?Sale
{
$sales = (clone $this->saleList)
->fetchItems()
->andSpec(Operator::equals(['s.id' => $id]))
->getSales();
if (!($sale = $sales->current())) {
return null;
}
return $sale;
}
public function getSaleSecurityCode(Sale $sale): string
{
return md5(implode('*', [$sale->id, $sale->code, $sale->dateCreated->format('Y-m-D H:i:s')]));
}
}