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;
|
||||
Reference in New Issue
Block a user