stock aggregate table
This commit is contained in:
@@ -197,13 +197,13 @@ class ReportManager
|
||||
|
||||
/**
|
||||
* Number of distinct SKUs with a positive running balance across all warehouses.
|
||||
* "In stock" means (total_in - total_out) > 0 in warehouse_balance.
|
||||
* "In stock" means (total_in - total_out) > 0 in etl_stock_summary.
|
||||
* Used by the reports_stats dashboard tile.
|
||||
*/
|
||||
public function getTotalProductInStock(): int
|
||||
{
|
||||
$sql = "SELECT COUNT(DISTINCT product_sku)
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id
|
||||
AND (total_in - total_out) > 0";
|
||||
return (int) $this->fetchScalar($sql);
|
||||
@@ -265,7 +265,7 @@ class ReportManager
|
||||
|
||||
/**
|
||||
* Return aggregated total_in, total_out, and min_stock for every SKU
|
||||
* across all warehouses from warehouse_balance.
|
||||
* across all warehouses from etl_stock_summary.
|
||||
*
|
||||
* Used internally by getLowStockCount and as a general balance query.
|
||||
*
|
||||
@@ -279,7 +279,7 @@ class ReportManager
|
||||
SUM(a.total_out) AS total_out,
|
||||
b.min_stock,
|
||||
b.cost_price
|
||||
FROM warehouse_balance a
|
||||
FROM etl_stock_summary a
|
||||
LEFT JOIN md_product b
|
||||
ON a.company_id = b.company_id
|
||||
AND a.product_sku = b.sku
|
||||
@@ -314,7 +314,7 @@ class ReportManager
|
||||
"SELECT
|
||||
ROUND(COALESCE(SUM(total_in), 0), 2) AS total_in,
|
||||
ROUND(COALESCE(SUM(total_out), 0), 2) AS total_out
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id"
|
||||
);
|
||||
$sth->execute([':company_id' => $this->companyId]);
|
||||
@@ -412,7 +412,7 @@ class ReportManager
|
||||
mp.product_image,
|
||||
mp.cost_price,
|
||||
ROUND(SUM(wb.total_in) - SUM(wb.total_out), 2) AS balance
|
||||
FROM warehouse_balance wb
|
||||
FROM etl_stock_summary wb
|
||||
INNER JOIN md_product mp
|
||||
ON wb.company_id = mp.company_id
|
||||
AND wb.product_sku = mp.sku
|
||||
@@ -493,7 +493,7 @@ class ReportManager
|
||||
ROUND(COALESCE(SUM(total_in), 0), 2) AS total_in,
|
||||
ROUND(COALESCE(SUM(total_out), 0), 2) AS total_out,
|
||||
COUNT(DISTINCT product_sku) AS active_products
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id
|
||||
AND month = :month"
|
||||
);
|
||||
@@ -517,7 +517,7 @@ class ReportManager
|
||||
"SELECT wb.product_sku,
|
||||
ROUND(SUM(wb.total_in) - SUM(wb.total_out), 2) AS balance,
|
||||
mp.min_stock
|
||||
FROM warehouse_balance wb
|
||||
FROM etl_stock_summary wb
|
||||
INNER JOIN md_product mp
|
||||
ON mp.company_id = wb.company_id
|
||||
AND mp.sku = wb.product_sku
|
||||
@@ -537,7 +537,7 @@ class ReportManager
|
||||
* Return monthly stock_in and stock_out totals for a rolling N-month window.
|
||||
*
|
||||
* Produces chart-ready arrays with labels (e.g. "Apr 2025"), stock_in, and stock_out.
|
||||
* Months with no data return 0. Data is sourced from warehouse_balance (all warehouses).
|
||||
* Months with no data return 0. Data is sourced from etl_stock_summary (all warehouses).
|
||||
*
|
||||
* @param int $months Number of months to include (default 12).
|
||||
* @return array Keys: labels (array), stock_in (array), stock_out (array).
|
||||
@@ -553,7 +553,7 @@ class ReportManager
|
||||
month,
|
||||
ROUND(SUM(total_in), 2) AS stock_in,
|
||||
ROUND(SUM(total_out), 2) AS stock_out
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id
|
||||
AND month BETWEEN :start AND :end
|
||||
GROUP BY month
|
||||
@@ -602,7 +602,7 @@ class ReportManager
|
||||
ROUND(SUM(wb.total_out), 2) AS total_out,
|
||||
p.product_name,
|
||||
pc.category AS category_name
|
||||
FROM warehouse_balance wb
|
||||
FROM etl_stock_summary wb
|
||||
INNER JOIN md_product p
|
||||
ON p.company_id = wb.company_id
|
||||
AND p.sku = wb.product_sku
|
||||
@@ -623,7 +623,7 @@ class ReportManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all months for which warehouse_balance data exists, newest first.
|
||||
* Return all months for which etl_stock_summary data exists, newest first.
|
||||
*
|
||||
* Used to populate the month selector on the dashboard and reports pages.
|
||||
*
|
||||
@@ -633,7 +633,7 @@ class ReportManager
|
||||
{
|
||||
$sth = $this->pdo->prepare(
|
||||
"SELECT DISTINCT month
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id
|
||||
ORDER BY month DESC"
|
||||
);
|
||||
@@ -743,7 +743,7 @@ class ReportManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Total in and out balance for a specific warehouse from warehouse_balance.
|
||||
* Total in and out balance for a specific warehouse from etl_stock_summary.
|
||||
*
|
||||
* @param int $warehouse_id The warehouse to query.
|
||||
* @return array Keys: total_in, total_out.
|
||||
@@ -754,7 +754,7 @@ class ReportManager
|
||||
"SELECT
|
||||
ROUND(COALESCE(SUM(total_in), 0), 2) AS total_in,
|
||||
ROUND(COALESCE(SUM(total_out), 0), 2) AS total_out
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id AND warehouse_id = :warehouse_id"
|
||||
);
|
||||
$sth->execute([':company_id' => $this->companyId, ':warehouse_id' => $warehouse_id]);
|
||||
@@ -764,7 +764,7 @@ class ReportManager
|
||||
/**
|
||||
* Count SKUs below min_stock threshold for a specific warehouse.
|
||||
*
|
||||
* Scoped to warehouse_balance rows for this warehouse only.
|
||||
* Scoped to etl_stock_summary rows for this warehouse only.
|
||||
*
|
||||
* @param int $warehouse_id The warehouse to query.
|
||||
* @return int Number of SKUs below min_stock.
|
||||
@@ -775,7 +775,7 @@ class ReportManager
|
||||
"SELECT wb.product_sku,
|
||||
ROUND(SUM(wb.total_in) - SUM(wb.total_out), 2) AS balance,
|
||||
mp.min_stock
|
||||
FROM warehouse_balance wb
|
||||
FROM etl_stock_summary wb
|
||||
INNER JOIN md_product mp
|
||||
ON mp.company_id = wb.company_id
|
||||
AND mp.sku = wb.product_sku
|
||||
@@ -795,7 +795,7 @@ class ReportManager
|
||||
/**
|
||||
* Return monthly stock_in and stock_out totals for a warehouse over the last 12 months.
|
||||
*
|
||||
* Queries the per-warehouse td_stock_<warehouse_id> table directly (not warehouse_balance)
|
||||
* Queries the per-warehouse td_stock_<warehouse_id> table directly (not etl_stock_summary)
|
||||
* for per-warehouse granularity. Produces chart-ready arrays with month labels.
|
||||
*
|
||||
* @param int $warehouse_id The warehouse to query.
|
||||
@@ -1173,7 +1173,7 @@ class ReportManager
|
||||
$wh_list = $warehouses->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Build per-lot balance by summing approved td_stock rows across all warehouses.
|
||||
// warehouse_balance is per-product, not per-lot, so we query td_stock directly.
|
||||
// etl_stock_summary is per-product, not per-lot, so we query td_stock directly.
|
||||
$lot_balance = [];
|
||||
$cid = (int) $this->companyId;
|
||||
|
||||
@@ -1350,7 +1350,7 @@ class ReportManager
|
||||
SUM(total_in) AS total_in,
|
||||
SUM(total_out) AS total_out,
|
||||
COUNT(DISTINCT warehouse_id) AS total_warehouse
|
||||
FROM warehouse_balance
|
||||
FROM etl_stock_summary
|
||||
WHERE company_id = :company_id"
|
||||
);
|
||||
$sth->execute([':company_id' => $this->companyId]);
|
||||
@@ -1364,7 +1364,7 @@ class ReportManager
|
||||
* Each row is one individual transaction — no grouping. Full datetime is
|
||||
* returned as stored in the td_stock_* table.
|
||||
*
|
||||
* Brought-forward balance is sourced from warehouse_balance for all months
|
||||
* Brought-forward balance is sourced from etl_stock_summary for all months
|
||||
* strictly before from_month, giving the cumulative net before the range.
|
||||
*
|
||||
* Used by reports/stock_movement.php.
|
||||
|
||||
Reference in New Issue
Block a user