Switch to daterangepicker for forecast and sales

This commit is contained in:
2025-01-17 20:35:53 -05:00
parent 0727529edf
commit de5bd785c1
4 changed files with 196 additions and 65 deletions

View File

@@ -209,7 +209,7 @@ router.get('/replenishment/metrics', async (req, res) => {
// GET /dashboard/forecast/metrics
// Returns sales forecasts for specified period
router.get('/forecast/metrics', async (req, res) => {
const days = Math.max(1, Math.min(365, parseInt(req.query.days) || 30));
const { startDate, endDate } = req.query;
try {
// Get summary metrics
const [metrics] = await executeQuery(`
@@ -218,8 +218,8 @@ router.get('/forecast/metrics', async (req, res) => {
COALESCE(SUM(forecast_revenue), 0) as total_forecast_revenue,
COALESCE(AVG(confidence_level), 0) as overall_confidence
FROM sales_forecasts
WHERE forecast_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL ? DAY)
`, [days]);
WHERE forecast_date BETWEEN ? AND ?
`, [startDate, endDate]);
// Get daily forecasts
const [dailyForecasts] = await executeQuery(`
@@ -229,10 +229,10 @@ router.get('/forecast/metrics', async (req, res) => {
COALESCE(SUM(forecast_revenue), 0) as revenue,
COALESCE(AVG(confidence_level), 0) as confidence
FROM sales_forecasts
WHERE forecast_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL ? DAY)
WHERE forecast_date BETWEEN ? AND ?
GROUP BY forecast_date
ORDER BY forecast_date
`, [days]);
`, [startDate, endDate]);
// Get category forecasts
const [categoryForecasts] = await executeQuery(`
@@ -243,10 +243,10 @@ router.get('/forecast/metrics', async (req, res) => {
COALESCE(AVG(cf.confidence_level), 0) as confidence
FROM category_forecasts cf
JOIN categories c ON cf.category_id = c.id
WHERE cf.forecast_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL ? DAY)
WHERE cf.forecast_date BETWEEN ? AND ?
GROUP BY c.id, c.name
ORDER BY revenue DESC
`, [days]);
`, [startDate, endDate]);
// Format response
const response = {
@@ -455,7 +455,7 @@ router.get('/best-sellers', async (req, res) => {
// GET /dashboard/sales/metrics
// Returns sales metrics for specified period
router.get('/sales/metrics', async (req, res) => {
const days = Math.max(1, Math.min(365, parseInt(req.query.days) || 30));
const { startDate, endDate } = req.query;
try {
const [dailyData] = await executeQuery(`
SELECT JSON_ARRAYAGG(
@@ -479,10 +479,10 @@ router.get('/sales/metrics', async (req, res) => {
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE o.canceled = false
AND o.date >= DATE_SUB(CURDATE(), INTERVAL ? DAY)
AND o.date BETWEEN ? AND ?
GROUP BY DATE(o.date)
) d
`, [days]);
`, [startDate, endDate]);
const [categoryData] = await executeQuery(`
SELECT JSON_ARRAYAGG(
@@ -504,10 +504,10 @@ router.get('/sales/metrics', async (req, res) => {
JOIN product_categories pc ON p.product_id = pc.product_id
JOIN categories c ON pc.category_id = c.id
WHERE o.canceled = false
AND o.date >= DATE_SUB(CURDATE(), INTERVAL ? DAY)
AND o.date BETWEEN ? AND ?
GROUP BY c.id, c.name
) c
`, [days]);
`, [startDate, endDate]);
const [metrics] = await executeQuery(`
SELECT
@@ -533,8 +533,8 @@ router.get('/sales/metrics', async (req, res) => {
GROUP BY DATE(date)
) daily ON DATE(o.date) = daily.sale_date
WHERE o.canceled = false
AND o.date >= DATE_SUB(CURDATE(), INTERVAL ? DAY)
`, [days]);
AND o.date BETWEEN ? AND ?
`, [startDate, endDate]);
const response = {
totalOrders: parseInt(metrics.total_orders) || 0,