Files
kupshop/class/class.CartItem.php
2025-08-02 16:30:27 +02:00

243 lines
5.9 KiB
PHP

<?php
use KupShop\CatalogBundle\Entity\Wrapper\ProductWrapper;
use KupShop\CatalogBundle\ProductList\ProductCollection;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
/**
* Class representing one item in cart.
*
* @author Joe
*/
class CartItemBase extends TemplateAccess
{
use DatabaseCommunication;
public $id;
public $id_product;
public $id_variation;
public $note;
public $pieces;
public $pieces_added;
public $product;
/**
* CartItemBase constructor.
*/
public function __construct($product)
{
$this->product = $product;
}
/**
* @return CartItem[]
*/
public static function createFromSpec($spec)
{
$items = sqlQueryBuilder()
->select('c.*')
->from('cart', 'c')
->where($spec)
->execute()->fetchAllAssociative();
if (!$items) {
return [];
}
$products = static::getProductCollection($items);
$result = [];
foreach ($items as $data) {
$itemKey = $data['id_variation'] ? $data['id_product'].'/'.$data['id_variation'] : $data['id_product'];
// fallback pro jistotu
if (!($product = ($products[$itemKey] ?? false))) {
$product = \Variation::createProductOrVariation($data['id_product'], $data['id_variation']);
$product->createFromDB();
}
$item = new static($product);
$item->loadFromArray($data);
$result[$data['id']] = $item;
}
return $result;
}
public static function createFromId($id)
{
return static::createFromSpec(\Query\Operator::equals(['c.id' => $id]));
}
public function loadFromArray($data)
{
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
public function fetchProduct()
{
if ($this->id < 0) {
return null;
}
$productWrapper = ServiceContainer::getService(ProductWrapper::class);
return $productWrapper->setObject($this->product);
}
public function fetchAvailability()
{
$dbcfg = Settings::getDefault();
$product = $this->product;
$InStore = max(0, $product->inStore);
// Dostupnost
$availability = 0; // Vyprodano
if ($dbcfg->prod_subtract_from_store == 'Y') {
if ($this->pieces <= $InStore) {
$availability = 1;
} // Skladem
if ($availability == 0 && findModule('products_suppliers')) {
$inSuppliers = $product->getInStoreSuppliers($this->id_variation);
$product->in_store_suppliers = intval($inSuppliers);
if ($inSuppliers > 0) {
// Je dostatek u dodavatele
$InStore += $inSuppliers;
if ($this->pieces <= $InStore) {
$availability = 2;
}
}
}
} else {
if ($product->deliveryTime == 0) {
$availability = 1;
}
}
$product->prepareDeliveryText();
return $availability;
}
public function fetchNote()
{
$product = $this->product;
return $product->parseNote($this->note);
}
public function fetchTitle()
{
$title = $this['product']->title;
if ($this->id_variation > 0) {
$title = Variations::fillInProductTitle($this->id_variation, $title);
}
return $title;
}
public function fetchProductTitle()
{
return $this['product']->title;
}
public function fetchVariationTitle()
{
if ($this->id_variation > 0) {
return $this['product']->variationTitle;
}
}
public function fetchPrice()
{
$product = $this->product;
$price = $this->fetchPiecePrice();
$pieces = toDecimal($this['pieces']);
return formatPrice($price['value_without_vat']->mul($pieces), $product->vat);
}
public function fetchPiecePrice()
{
$product = $this->product;
$pieces = toDecimal($this['pieces']);
$price = $product->getPrice($this->id_variation, $this->fetchNote(), $pieces);
$IDcategory = $product['priceLevelSections'] ?? null;
$IDproducer = $product->idProducer ?? -1;
return formatCustomerPrice($price, $product->discount, $product->vat, $product->id, $IDcategory, $IDproducer);
}
public function fetchProducer()
{
$this['product']->fetchProducer();
return $this['product']->producer['title'];
}
public function fetchId_producer()
{
$this['product']->fetchProducer();
return $this['product']->producer['id'];
}
public function fetchProduct_pieces()
{
return $this->pieces;
}
public function fetchPieces()
{
return $this->pieces_added ?: $this->pieces;
}
public function fetchFreeShipping()
{
$product = $this->product;
return isset($product->campaign_codes['Z']);
}
public function fetchQuantity()
{
return $this['pieces'];
}
protected static function getProductCollection(array $cartItems): ProductCollection
{
$products = [];
foreach ($cartItems as $item) {
$products[$item['id_product']] = $products[$item['id_product']] ?? null;
if ($item['id_variation']) {
$products[$item['id_product']][] = $item['id_variation'];
}
}
$productList = ServiceContainer::getService(\KupShop\CatalogBundle\ProductList\ProductList::class);
$productList->setVariationsAsResult(true);
$productList->andSpec(\Query\Product::productsAndVariationsIds($products));
return $productList->getProducts();
}
}
if (empty($subclass)) {
class CartItem extends CartItemBase
{
}
}