Fix calculate errors
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user