from __future__ import annotations import logging import time from datetime import datetime from zoneinfo import ZoneInfo from app.config import config from app.db import init_db from app.reporting import due_jobs, send_scheduled_job logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") logger = logging.getLogger(__name__) def run_once() -> int: tz = ZoneInfo(config.app_timezone) now = datetime.now(tz) jobs = due_jobs(now) sent = 0 for job in jobs: logger.info( "Sending %s report for %s to %s", job.cadence, f"{job.start_date} to {job.end_date}", job.recipient_email, ) try: if send_scheduled_job(job, tz): sent += 1 except Exception: logger.exception("Scheduled report failed") return sent def main() -> None: init_db() poll_seconds = max(60, config.report_scheduler_poll_seconds) logger.info("Report scheduler started; polling every %s seconds", poll_seconds) while True: run_once() time.sleep(poll_seconds) if __name__ == "__main__": main()