From fe06bedf9c9c6112c179fd2d147a73e5c25a386c Mon Sep 17 00:00:00 2001 From: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:12:35 -0400 Subject: [PATCH] Fix Finance Tracker aggregate variance and cash-flow scenario ranges Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com> --- support/support-finance-tracker.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/support/support-finance-tracker.md b/support/support-finance-tracker.md index f12b1884..6b8f23ae 100644 --- a/support/support-finance-tracker.md +++ b/support/support-finance-tracker.md @@ -64,9 +64,9 @@ WITH budget_actuals AS ( actual_amount, DATE_TRUNC('quarter', date) as quarter, budget_amount - actual_amount as variance, - (actual_amount - budget_amount) / budget_amount * 100 as variance_percentage + (actual_amount - budget_amount) * 100.0 / NULLIF(budget_amount, 0) as variance_percentage FROM financial_data - WHERE fiscal_year = YEAR(CURRENT_DATE()) + WHERE fiscal_year = EXTRACT(YEAR FROM CURRENT_DATE) ), department_summary AS ( SELECT @@ -75,7 +75,8 @@ department_summary AS ( SUM(budget_amount) as total_budget, SUM(actual_amount) as total_actual, SUM(variance) as total_variance, - AVG(variance_percentage) as avg_variance_pct + (SUM(actual_amount) - SUM(budget_amount)) * 100.0 / + NULLIF(SUM(budget_amount), 0) as variance_pct FROM budget_actuals GROUP BY department, quarter ) @@ -85,10 +86,11 @@ SELECT total_budget, total_actual, total_variance, - avg_variance_pct, + variance_pct, CASE - WHEN ABS(avg_variance_pct) <= 5 THEN 'On Track' - WHEN avg_variance_pct > 5 THEN 'Over Budget' + WHEN variance_pct IS NULL THEN 'No Budget Baseline' + WHEN ABS(variance_pct) <= 5 THEN 'On Track' + WHEN variance_pct > 5 THEN 'Over Budget' ELSE 'Under Budget' END as budget_status, total_budget - total_actual as remaining_budget @@ -145,13 +147,14 @@ class CashFlowManager: 'forecasted_payments': forecasted_payments, 'net_cash_flow': net_flow, 'cumulative_cash': cumulative_cash, - 'confidence_interval_low': net_flow * 0.85, - 'confidence_interval_high': net_flow * 1.15 + # Illustrative +/-15% scenarios, not a statistical confidence interval. + 'scenario_low': net_flow - abs(net_flow) * 0.15, + 'scenario_high': net_flow + abs(net_flow) * 0.15 }) return pd.DataFrame(rows, columns=[ 'date', 'forecasted_receipts', 'forecasted_payments', 'net_cash_flow', - 'cumulative_cash', 'confidence_interval_low', 'confidence_interval_high' + 'cumulative_cash', 'scenario_low', 'scenario_high' ]) def identify_cash_flow_risks(self, forecast_df):