[OOP] contact,inventory,ics,dashboard

This commit is contained in:
Thanakorn S
2026-04-28 15:44:57 +07:00
parent 3d3b497c08
commit 2061624641
49 changed files with 1946 additions and 2146 deletions
@@ -1,60 +1,13 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/ReportManager.php';
$product_sku = $data['product_sku'] ?? '';
$lot_number = $data['lot_number'] ?? '';
if (!$product_sku || !$lot_number) {
$answer['output'] = [];
$answer['success'] = 1;
exit(json_encode($answer));
}
// Discover all warehouses
$sth = $pdo2->prepare(
"SELECT id, warehouse_name FROM md_warehouse
WHERE company_id = :company_id AND status = 1"
$report = new ReportManager($pdo2, $company_id);
$answer['output'] = $report->getLotStockLog(
$data['product_sku'] ?? '',
$data['lot_number'] ?? ''
);
$sth->execute([':company_id' => $company_id]);
$warehouses = $sth->fetchAll(PDO::FETCH_ASSOC);
$rows = [];
foreach ($warehouses as $wh) {
$safe = preg_replace('/[^a-zA-Z0-9_]/', '', $wh['warehouse_name']);
$table = "td_stock_{$safe}";
$sth = $pdo2->prepare(
"SELECT
s.id,
s.date,
s.type,
s.zone,
s.aisle,
s.rack,
ROUND(COALESCE(s.`in`, 0), 2) AS stock_in,
ROUND(COALESCE(s.`out`, 0), 2) AS stock_out,
s.serial_number,
s.description,
'{$wh['warehouse_name']}' AS warehouse_name
FROM `{$table}` s
WHERE s.company_id = :company_id
AND s.product_sku = :product_sku
AND s.lot_number = :lot_number
ORDER BY s.date DESC"
);
$sth->execute([
':company_id' => $company_id,
':product_sku' => $product_sku,
':lot_number' => $lot_number,
]);
$rows = array_merge($rows, $sth->fetchAll(PDO::FETCH_ASSOC));
}
// Sort all rows by date DESC
usort($rows, fn($a, $b) => strcmp($b['date'], $a['date']));
$answer['output'] = $rows;
$answer['success'] = 1;
exit(json_encode($answer));
?>
@@ -1,61 +1,16 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/ReportManager.php';
// All lots with running balance across all warehouses
$sth = $pdo2->prepare(
"SELECT
l.id,
l.product_sku,
l.lot_number,
l.expiry_date,
l.description,
p.product_name,
DATEDIFF(l.expiry_date, CURDATE()) AS days_remaining,
COALESCE(
(SELECT ROUND(SUM(wb.total_in) - SUM(wb.total_out), 2)
FROM warehouse_balance wb
WHERE wb.company_id = l.company_id
AND wb.product_sku = l.product_sku),
0
) AS balance
FROM md_lot l
INNER JOIN md_product p
ON p.company_id = l.company_id
AND p.sku = l.product_sku
WHERE l.company_id = :company_id
ORDER BY l.product_sku, l.expiry_date ASC"
);
$sth->execute([':company_id' => $company_id]);
db_check($sth, $answer);
$report = new ReportManager($pdo2, $company_id);
$result = $report->getProductLots();
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
$total = count($rows);
$active = 0;
$expired = 0;
$near = 0;
foreach ($rows as &$row) {
$days = (int) $row['days_remaining'];
$balance = (float) $row['balance'];
if ($balance > 0) $active++;
if ($days < 0) $expired++;
if ($days >= 0 && $days <= 30) $near++;
// Status
if ($days < 0) $row['status'] = 'expired';
elseif ($days <= 7) $row['status'] = 'critical';
elseif ($days <= 30) $row['status'] = 'near';
else $row['status'] = 'ok';
}
unset($row);
$answer['output'] = $rows;
$answer['total'] = $total;
$answer['active'] = $active;
$answer['expired'] = $expired;
$answer['near'] = $near;
$answer['success'] = 1;
$answer['output'] = $result['rows'];
$answer['total'] = $result['total'];
$answer['active'] = $result['active'];
$answer['expired'] = $result['expired'];
$answer['near'] = $result['near'];
$answer['success'] = 1;
exit(json_encode($answer));
?>
+3 -23
View File
@@ -1,6 +1,7 @@
<?php
session_start();
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/ReportManager.php';
$rack_id = (int)($data['rack_id'] ?? 0);
@@ -10,29 +11,8 @@
exit(json_encode($answer));
}
$sql = "SELECT
rl.id,
rl.dt,
rl.action,
rl.product_sku,
rl.td_stock_id,
rl.login,
u.name AS user_name
FROM md_rack_log rl
LEFT JOIN {$db_database}.user u
ON u.user_id = rl.user_id
WHERE rl.company_id = :company_id
AND rl.md_rack_id = :rack_id
ORDER BY rl.dt DESC";
$sth = $pdo2->prepare($sql);
$sth->execute([
':company_id' => $company_id,
':rack_id' => $rack_id,
]);
db_check($sth, $answer);
$answer['output'] = $sth->fetchAll(PDO::FETCH_ASSOC);
$report = new ReportManager($pdo2, $company_id);
$answer['output'] = $report->getRackLog($rack_id);
$answer['success'] = 1;
exit(json_encode($answer));
?>
@@ -3,43 +3,14 @@
require '../../../assets/utils/db_auth.php';
require '../../../assets/utils/classes/ReportManager.php';
$report = new ReportManager($pdo2, $company_id);
// Stats
$report = new ReportManager($pdo2, $company_id);
$total = $report->getTotalCapacity();
$occupied = $report->getSpaceUsed();
$empty = $total - $occupied;
// All racks with warehouse name, product info and stock info
$sql = "SELECT
r.id,
r.zone,
r.aisle,
r.rack,
r.product_sku,
r.td_stock_id,
mw.warehouse_name,
mw.id AS warehouse_id,
p.product_name,
CASE WHEN r.product_sku IS NOT NULL THEN 'occupied' ELSE 'empty' END AS status
FROM md_rack r
INNER JOIN md_warehouse mw
ON mw.company_id = r.company_id
AND mw.id = r.warehouse
LEFT JOIN md_product p
ON p.company_id = r.company_id
AND p.sku = r.product_sku
WHERE r.company_id = :company_id
ORDER BY mw.warehouse_name, r.zone, CAST(r.aisle AS UNSIGNED), r.aisle, CAST(r.rack AS UNSIGNED), r.rack";
$sth = $pdo2->prepare($sql);
$sth->execute([':company_id' => $company_id]);
db_check($sth, $answer);
$answer['output'] = $sth->fetchAll(PDO::FETCH_ASSOC);
$answer['output'] = $report->getRackOccupancy();
$answer['total'] = $total;
$answer['occupied'] = $occupied;
$answer['empty'] = $empty;
$answer['empty'] = $total - $occupied;
$answer['success'] = 1;
exit(json_encode($answer));
?>