first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

View File

@@ -0,0 +1,104 @@
<?php
namespace KupShop\AdminBundle\Util\Stats;
use KupShop\AdminBundle\Query\StockIn;
use KupShop\WarehouseBundle\Util\InventoryWorker;
class StoreDataLoader
{
public ?InventoryWorker $inventoryWorker = null;
/** @required */
public function setInventoryWorker(?InventoryWorker $inventoryWorker = null): void
{
$this->inventoryWorker = $inventoryWorker;
}
public function getCurrentStoreValue($to = null)
{
$qb = $this->getCurrentStoreQb($to);
if (findModule(\Modules::WAREHOUSE)) {
$qb->addSelect(
'SUM(ss.in_store*r.average_price) as without_vat,SUM((ss.in_store*r.average_price)*(1+ifnull(v.vat,0)/100)) as with_vat'
);
} else {
$qb->select(
'SUM(s.in_store*r.average_price) as without_vat,SUM((s.in_store*r.average_price)*(1+ifnull(v.vat,0)/100)) as with_vat'
);
}
return $qb->execute()->fetch();
}
public function getCurrentStoreQb(?string $dateFormat = null)
{
$date = (new \DateTime($dateFormat ?? 'now'))->setTime(23, 59, 59);
$priceSubquery = StockIn::getAveragePriceSubQuery($date);
$sql = sqlQueryBuilder()
->fromProducts()
->joinVariationsOnProducts()
->joinVatsOnProducts()
->leftJoinSubQuery('pv', $priceSubquery, 'r', 'r.id_product = p.id AND ((pv.id IS NULL AND r.id_variation IS NULL) OR pv.id = r.id_variation)')
->addParameters(
[
'dateTo' => $date->format('Y-m-d H:i:s'),
]
);
if (findModule(\Modules::WAREHOUSE)) {
$logSubquery = sqlQueryBuilder()
->select('SUM(IF(wl.old_id_position IS NULL OR wl.old_id_position = :inventoryPositionId, wl.pieces, -wl.pieces)) as in_store_log, wl.id_product, wl.id_variation')
->from('warehouse_log', 'wl')
->andWhere('wl.old_id_position IS NULL OR wl.new_id_position IS NULL OR wl.old_id_position = :inventoryPositionId')
->andWhere('wl.update_datetime > :dateTo')
->groupBy('wl.id_product, wl.id_variation')
->setParameter('inventoryPositionId', $this->inventoryWorker->getInventoryPosition());
$stockSubquery = sqlQueryBuilder()
->select('SUM(wp.pieces) as in_store_stock, wp.id_product, wp.id_variation')
->from('warehouse_products', 'wp')
->groupBy('wp.id_product, wp.id_variation');
$inStoreSubquery = sqlQueryBuilder()
->select('ps.id as id_product, pvs.id as id_variation, (COALESCE((wp.in_store_stock), 0) - COALESCE(wl.in_store_log, 0)) as in_store')
->fromProducts('ps')
->leftJoin('ps', 'products_variations', 'pvs', 'ps.id = pvs.id_product')
->leftJoinSubQuery('ps', $stockSubquery, 'wp', 'wp.id_product = ps.id AND wp.id_variation <=> pvs.id')
->leftJoinSubQuery('ps', $logSubquery, 'wl', 'wl.id_product = ps.id AND wl.id_variation <=> pvs.id');
$sql->leftJoinSubQuery('pv', $inStoreSubquery, 'ss', 'ss.id_product = p.id AND pv.id <=> ss.id_variation')
->andWhere('ss.in_store > 0');
} else {
$ordersSubquery = sqlQueryBuilder()
->select('SUM(oi.pieces) as piecesInOrder, oi.id_product, oi.id_variation')
->from('orders', 'o')
->leftJoin('o', 'order_items', 'oi', 'o.id = oi.id_order')
->where('o.status_storno = 0')
->andWhere('o.date_created > :dateTo')
->groupBy('oi.id_product, oi.id_variation');
$stockInSubquery = sqlQueryBuilder()->select('SUM(sii2.quantity) pieces_stocked_in, sii2.id_product, sii2.id_variation')
->from('stock_in_items', 'sii2')
->join('sii2', 'stock_in', 'si2', 'si2.id=sii2.id_stock_in')
->where('COALESCE(si2.date_stock_in, si2.date_issued) >= :dateTo')
->andWhere('si2.id_index = \'invoice\'')
->groupBy('sii2.id_product, sii2.id_variation');
$quantitySubquery = sqlQueryBuilder()->select(
'p.id as id_product, pv.id as id_variation, COALESCE(pv.in_store, p.in_store) + COALESCE(piecesInOrder.piecesInOrder, 0) - COALESCE(pieces_stocked_in.pieces_stocked_in, 0) in_store'
)
->fromProducts()
->joinVariationsOnProducts()
->leftJoinSubQuery('p', $ordersSubquery, 'piecesInOrder', 'p.id = piecesInOrder.id_product AND pv.id <=> piecesInOrder.id_variation')
->leftJoinSubQuery('p', $stockInSubquery, 'pieces_stocked_in', 'p.id = pieces_stocked_in.id_product AND pv.id <=> pieces_stocked_in.id_variation');
$sql->leftJoinSubQuery('pv', $quantitySubquery, 's', 's.id_product=p.id AND (pv.id IS NULL or pv.id=s.id_variation)');
$sql->andWhere('s.in_store > 0');
}
return $sql;
}
}