Files
wms-app/app/assets/utils/classes/StockSourceManager.php
T
2026-05-27 17:14:53 +07:00

87 lines
2.7 KiB
PHP

<?php
class StockSourceManager
{
private PDO $pdo;
private int $companyId;
public function __construct(PDO $pdo, int $company_id)
{
$this->pdo = $pdo;
$this->companyId = $company_id;
}
public function getBySource(string $source, int $source_id): array
{
$source = trim($source);
if ($source === '' || $source_id <= 0) {
throw new Exception('source and source_id are required.');
}
$warehouses = $this->getWarehouseNames();
$rows = [];
foreach ($this->getStockTables() as $table) {
if (!preg_match('/^td_stock_(\d+)$/', $table, $match)) continue;
$warehouse_id = (int)$match[1];
$sth = $this->pdo->prepare(
"SELECT s.id, s.type, s.product_sku, s.`in`, s.`out`,
s.zone, s.aisle, s.bin, s.lot_number, s.serial_number,
s.status, s.date, s.price,
p.product_name
FROM `{$table}` s
LEFT JOIN md_product p
ON p.company_id = s.company_id
AND p.sku = s.product_sku
WHERE s.company_id = :company_id
AND s.source = :source
AND s.source_id = :source_id
ORDER BY s.date ASC"
);
$sth->execute([
':company_id' => $this->companyId,
':source' => $source,
':source_id' => $source_id,
]);
foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {
$row['warehouse_id'] = $warehouse_id;
$row['warehouse_name'] = $warehouses[$warehouse_id] ?? "WH {$warehouse_id}";
$row['quantity'] = $row['type'] === 'out' ? (float)$row['out'] : (float)$row['in'];
$rows[] = $row;
}
}
return $rows;
}
private function getWarehouseNames(): array
{
$sth = $this->pdo->prepare(
"SELECT id, warehouse_name
FROM md_warehouse
WHERE company_id = :company_id"
);
$sth->execute([':company_id' => $this->companyId]);
$warehouses = [];
foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $warehouse) {
$warehouses[(int)$warehouse['id']] = $warehouse['warehouse_name'];
}
return $warehouses;
}
private function getStockTables(): array
{
$sth = $this->pdo->prepare(
"SELECT table_name
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name LIKE 'td_stock_%'"
);
$sth->execute();
return $sth->fetchAll(PDO::FETCH_COLUMN);
}
}
?>