diff --git a/server/src/routes/store-expense.ts b/server/src/routes/store-expense.ts index 924bc44..0fe8a82 100644 --- a/server/src/routes/store-expense.ts +++ b/server/src/routes/store-expense.ts @@ -57,6 +57,7 @@ router.get('/overview', async (req: AuthRequest, res) => { round(sum(consumption)::numeric, 2) AS total_consumption, round(sum(discount)::numeric, 2) AS total_discount, round(sum(received)::numeric, 2) AS total_received, + round(sum(received) FILTER (WHERE operating_expense IS NOT NULL)::numeric, 2) AS matched_received, round(sum(received) / nullif(sum(bill_count), 0), 2) AS avg_bill_value, round(sum(operating_expense)::numeric, 2) AS total_expense, round(sum(wage_expense)::numeric, 2) AS total_wage, @@ -70,18 +71,18 @@ router.get('/overview', async (req: AuthRequest, res) => { round(sum(theoretical_cost)::numeric, 2) AS total_theoretical_cost, round(sum(actual_store_contribution)::numeric, 2) AS total_contribution, round(sum(theoretical_store_contribution)::numeric, 2) AS total_theoretical_contribution, - round(sum(received) - sum(theoretical_cost) - sum(operating_expense), 2) AS theoretical_net_profit, - round(sum(received) - sum(actual_food_cost) - sum(operating_expense), 2) AS actual_net_profit, + round(sum(received) FILTER (WHERE operating_expense IS NOT NULL) - sum(theoretical_cost) - sum(operating_expense), 2) AS theoretical_net_profit, + round(sum(received) FILTER (WHERE operating_expense IS NOT NULL) - sum(actual_food_cost) - sum(operating_expense), 2) AS actual_net_profit, round(sum(area_sqm)::numeric, 2) AS total_area, - round((1 - sum(operating_expense) / nullif(sum(received), 0)) * 100, 2) AS overall_expense_rate_pct, - round((1 - (sum(actual_food_cost) + sum(operating_expense)) / nullif(sum(received), 0)) * 100, 2) AS overall_contribution_rate_pct, - round((sum(received) - sum(theoretical_cost) - sum(operating_expense)) / nullif(sum(received), 0) * 100, 2) AS theoretical_net_margin_pct, - round((sum(received) - sum(actual_food_cost) - sum(operating_expense)) / nullif(sum(received), 0) * 100, 2) AS actual_net_margin_pct, - round(sum(theoretical_cost) / nullif(sum(received), 0) * 100, 2) AS theoretical_food_cost_rate_pct, - round(sum(actual_food_cost) / nullif(sum(received), 0) * 100, 2) AS actual_food_cost_rate_pct, - round(sum(wage_expense) / nullif(sum(received), 0) * 100, 2) AS overall_wage_rate_pct, - round(sum(rent_expense) / nullif(sum(received), 0) * 100, 2) AS overall_rent_rate_pct, - round(sum(utility_expense) / nullif(sum(received), 0) * 100, 2) AS overall_utility_rate_pct + round(sum(operating_expense) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS overall_expense_rate_pct, + round((sum(received) FILTER (WHERE operating_expense IS NOT NULL) - sum(actual_food_cost) - sum(operating_expense)) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS overall_contribution_rate_pct, + round((sum(received) FILTER (WHERE operating_expense IS NOT NULL) - sum(theoretical_cost) - sum(operating_expense)) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS theoretical_net_margin_pct, + round((sum(received) FILTER (WHERE operating_expense IS NOT NULL) - sum(actual_food_cost) - sum(operating_expense)) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS actual_net_margin_pct, + round(sum(theoretical_cost) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS theoretical_food_cost_rate_pct, + round(sum(actual_food_cost) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS actual_food_cost_rate_pct, + round(sum(wage_expense) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS overall_wage_rate_pct, + round(sum(rent_expense) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS overall_rent_rate_pct, + round(sum(utility_expense) / nullif(sum(received) FILTER (WHERE operating_expense IS NOT NULL), 0) * 100, 2) AS overall_utility_rate_pct FROM full_scope `, [month]) sendSuccess(res, result.rows[0])