116 lines
3.5 KiB
PHP
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')]));
|
|
}
|
|
}
|