More layout/header tweaks for purchase orders
This commit is contained in:
@@ -836,4 +836,65 @@ router.get('/order-vs-received', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// New endpoint for delivery metrics
|
||||||
|
router.get('/delivery-metrics', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const pool = req.app.locals.pool;
|
||||||
|
|
||||||
|
const { rows: deliveryData } = await pool.query(`
|
||||||
|
WITH po_dates AS (
|
||||||
|
SELECT
|
||||||
|
po_id,
|
||||||
|
date as order_date
|
||||||
|
FROM purchase_orders
|
||||||
|
WHERE status != 'canceled'
|
||||||
|
GROUP BY po_id, date
|
||||||
|
),
|
||||||
|
receiving_dates AS (
|
||||||
|
SELECT
|
||||||
|
receiving_id as po_id,
|
||||||
|
MIN(received_date) as first_received_date
|
||||||
|
FROM receivings
|
||||||
|
GROUP BY receiving_id
|
||||||
|
),
|
||||||
|
delivery_times AS (
|
||||||
|
SELECT
|
||||||
|
po.po_id,
|
||||||
|
po.order_date,
|
||||||
|
r.first_received_date,
|
||||||
|
CASE
|
||||||
|
WHEN r.first_received_date IS NOT NULL AND po.order_date IS NOT NULL
|
||||||
|
THEN (r.first_received_date::date - po.order_date::date)
|
||||||
|
ELSE NULL
|
||||||
|
END as delivery_days
|
||||||
|
FROM po_dates po
|
||||||
|
JOIN receiving_dates r ON po.po_id = r.po_id
|
||||||
|
WHERE
|
||||||
|
r.first_received_date IS NOT NULL
|
||||||
|
AND po.order_date IS NOT NULL
|
||||||
|
AND r.first_received_date::date >= po.order_date::date
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
ROUND(AVG(delivery_days)::numeric, 1) as avg_delivery_days,
|
||||||
|
ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY delivery_days)::numeric, 1) as median_delivery_days,
|
||||||
|
MIN(delivery_days) as min_delivery_days,
|
||||||
|
MAX(delivery_days) as max_delivery_days,
|
||||||
|
COUNT(*) as total_orders_with_delivery
|
||||||
|
FROM delivery_times
|
||||||
|
WHERE delivery_days >= 0 AND delivery_days <= 365 -- Filter out unreasonable values
|
||||||
|
`);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
avg_delivery_days: Number(deliveryData[0]?.avg_delivery_days) || 0,
|
||||||
|
median_delivery_days: Number(deliveryData[0]?.median_delivery_days) || 0,
|
||||||
|
min_delivery_days: Number(deliveryData[0]?.min_delivery_days) || 0,
|
||||||
|
max_delivery_days: Number(deliveryData[0]?.max_delivery_days) || 0,
|
||||||
|
total_orders_with_delivery: Number(deliveryData[0]?.total_orders_with_delivery) || 0
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching delivery metrics:', error);
|
||||||
|
res.status(500).json({ error: 'Failed to fetch delivery metrics' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user