Add DOW-average fallback for dry/wet forecast when covers data is zero

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jtricerolph 2026-07-20 12:41:53 +00:00
parent f0d4fb3beb
commit da8c27d0de

View file

@ -386,6 +386,24 @@ async def get_revenue_forecast(
logger.warning(f"Covers forecast failed: {e}") logger.warning(f"Covers forecast failed: {e}")
covers_by_date = {} covers_by_date = {}
# DOW averages from recent 8 weeks — fallback when covers gives zero for future dates
dow_result = await db.execute(
text("""
SELECT EXTRACT(ISODOW FROM date)::int AS dow,
AVG(dry) FILTER (WHERE dry > 0) AS avg_dry,
AVG(wet) FILTER (WHERE wet > 0) AS avg_wet
FROM newbook_net_revenue_data
WHERE date >= :cutoff AND date < :today
GROUP BY dow
"""),
{"cutoff": today - timedelta(days=56), "today": today}
)
dow_dry = {}
dow_wet = {}
for row in dow_result.fetchall():
dow_dry[int(row.dow)] = float(row.avg_dry) if row.avg_dry else 0
dow_wet[int(row.dow)] = float(row.avg_wet) if row.avg_wet else 0
data = [] data = []
current = start current = start
while current <= end: while current <= end:
@ -461,7 +479,12 @@ async def get_revenue_forecast(
dinner_forecast * get_spend_by_period('dinner', 'wet') dinner_forecast * get_spend_by_period('dinner', 'wet')
) )
else: else:
dry_otb = dry_forecast = wet_otb = wet_forecast = 0 # No covers data — fall back to DOW average from recent 8 weeks
dow = current.isoweekday() # 1=Mon … 7=Sun
dry_otb = 0
dry_forecast = dow_dry.get(dow, 0)
wet_otb = 0
wet_forecast = dow_wet.get(dow, 0)
day_data = { day_data = {
"date": current.isoformat(), "date": current.isoformat(),