Switch to daterangepicker for forecast and sales
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user