Fix calculate errors

This commit is contained in:
2025-02-01 23:38:13 -05:00
parent 0a51328da2
commit bd5bcdd548
6 changed files with 92 additions and 92 deletions

View File

@@ -52,7 +52,9 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
stock_received,
stock_ordered,
avg_price,
profit_margin
profit_margin,
inventory_value,
gmroi
)
WITH sales_data AS (
SELECT
@@ -69,11 +71,12 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
ELSE ((SUM((o.price - COALESCE(o.discount, 0)) * o.quantity) -
SUM(COALESCE(p.cost_price, 0) * o.quantity)) /
SUM((o.price - COALESCE(o.discount, 0)) * o.quantity)) * 100
END as profit_margin
END as profit_margin,
p.cost_price * p.stock_quantity as inventory_value
FROM orders o
JOIN products p ON o.pid = p.pid
WHERE o.canceled = 0
GROUP BY o.pid, YEAR(o.date), MONTH(o.date)
GROUP BY o.pid, YEAR(o.date), MONTH(o.date), p.cost_price, p.stock_quantity
),
purchase_data AS (
SELECT
@@ -81,40 +84,9 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
YEAR(date) as year,
MONTH(date) as month,
SUM(received) as stock_received,
SUM(ordered) as stock_ordered,
COUNT(DISTINCT CASE WHEN receiving_status = 40 THEN id END) as fulfilled_orders,
COUNT(DISTINCT id) as total_orders,
AVG(CASE
WHEN receiving_status = 40
THEN DATEDIFF(received_date, date)
END) as avg_lead_time,
SUM(CASE
WHEN receiving_status = 40 AND received_date > expected_date
THEN 1 ELSE 0
END) as late_deliveries
SUM(ordered) as stock_ordered
FROM purchase_orders
GROUP BY pid, YEAR(date), MONTH(date)
),
stock_trends AS (
SELECT
p.pid,
YEAR(po.date) as year,
MONTH(po.date) as month,
AVG(p.stock_quantity) as avg_stock_level,
STDDEV(p.stock_quantity) as stock_volatility,
SUM(CASE
WHEN p.stock_quantity <= COALESCE(pm.reorder_point, 5)
THEN 1 ELSE 0
END) as days_below_reorder,
COUNT(*) as total_days
FROM products p
CROSS JOIN (
SELECT DISTINCT DATE(date) as date
FROM purchase_orders
WHERE date >= DATE_SUB(CURRENT_DATE, INTERVAL 12 MONTH)
) po
LEFT JOIN product_metrics pm ON p.pid = pm.pid
GROUP BY p.pid, YEAR(po.date), MONTH(po.date)
)
SELECT
s.pid,
@@ -128,23 +100,17 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
COALESCE(p.stock_ordered, 0) as stock_ordered,
s.avg_price,
s.profit_margin,
COALESCE(p.fulfilled_orders, 0) as fulfilled_orders,
COALESCE(p.total_orders, 0) as total_orders,
COALESCE(p.avg_lead_time, 0) as avg_lead_time,
COALESCE(p.late_deliveries, 0) as late_deliveries,
COALESCE(st.avg_stock_level, 0) as avg_stock_level,
COALESCE(st.stock_volatility, 0) as stock_volatility,
COALESCE(st.days_below_reorder, 0) as days_below_reorder,
COALESCE(st.total_days, 0) as total_days
s.inventory_value,
CASE
WHEN s.inventory_value > 0 THEN
(s.total_revenue - s.total_cost) / s.inventory_value
ELSE 0
END as gmroi
FROM sales_data s
LEFT JOIN purchase_data p
ON s.pid = p.pid
AND s.year = p.year
AND s.month = p.month
LEFT JOIN stock_trends st
ON s.pid = st.pid
AND s.year = st.year
AND s.month = st.month
UNION
SELECT
p.pid,
@@ -158,23 +124,13 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
p.stock_ordered,
0 as avg_price,
0 as profit_margin,
p.fulfilled_orders,
p.total_orders,
p.avg_lead_time,
p.late_deliveries,
st.avg_stock_level,
st.stock_volatility,
st.days_below_reorder,
st.total_days
(SELECT cost_price * stock_quantity FROM products WHERE pid = p.pid) as inventory_value,
0 as gmroi
FROM purchase_data p
LEFT JOIN sales_data s
ON p.pid = s.pid
AND p.year = s.year
AND p.month = s.month
LEFT JOIN stock_trends st
ON p.pid = st.pid
AND p.year = st.year
AND p.month = st.month
WHERE s.pid IS NULL
ON DUPLICATE KEY UPDATE
total_quantity_sold = VALUES(total_quantity_sold),
@@ -185,7 +141,8 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
stock_ordered = VALUES(stock_ordered),
avg_price = VALUES(avg_price),
profit_margin = VALUES(profit_margin),
last_calculated_at = CURRENT_TIMESTAMP
inventory_value = VALUES(inventory_value),
gmroi = VALUES(gmroi)
`);
processedCount = Math.floor(totalProducts * 0.60);
@@ -231,8 +188,7 @@ async function calculateTimeAggregates(startTime, totalProducts, processedCount,
WHEN COALESCE(fin.inventory_value, 0) > 0 AND fin.days_in_period > 0 THEN
(COALESCE(fin.gross_profit, 0) * (365.0 / fin.days_in_period)) / COALESCE(fin.inventory_value, 0)
ELSE 0
END,
pta.last_calculated_at = CURRENT_TIMESTAMP
END
`);
processedCount = Math.floor(totalProducts * 0.65);