import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.interval import IntervalTrigger from app.core.database import SessionLocal from app.services.report_service import ReportService from app.services.trigger_scheduler import TriggerSchedulerService logger = logging.getLogger(__name__) scheduler = AsyncIOScheduler() async def weekly_report_job(): """Job function to generate weekly reports.""" logger.info("Starting weekly report generation...") db = SessionLocal() try: generated_for = await ReportService.generate_all_weekly_reports(db) logger.info(f"Weekly reports generated for {len(generated_for)} users") except Exception as e: logger.error(f"Error generating weekly reports: {e}") finally: db.close() async def schedule_trigger_job(): """Job function to evaluate and execute schedule triggers. This runs every minute and checks: 1. Cron-based schedule triggers 2. Deadline reminder triggers """ db = SessionLocal() try: logs = TriggerSchedulerService.evaluate_schedule_triggers(db) if logs: logger.info(f"Schedule trigger job executed {len(logs)} triggers") except Exception as e: logger.error(f"Error in schedule trigger job: {e}") finally: db.close() def init_scheduler(): """Initialize the scheduler with jobs.""" # Weekly report - Every Friday at 16:00 scheduler.add_job( weekly_report_job, CronTrigger(day_of_week='fri', hour=16, minute=0), id='weekly_report', name='Generate Weekly Reports', replace_existing=True, ) # Schedule trigger evaluation - Every minute scheduler.add_job( schedule_trigger_job, IntervalTrigger(minutes=1), id='schedule_triggers', name='Evaluate Schedule Triggers', replace_existing=True, ) logger.info("Scheduler initialized with jobs: weekly_report (Friday 16:00), schedule_triggers (every minute)") def start_scheduler(): """Start the scheduler.""" if not scheduler.running: init_scheduler() scheduler.start() logger.info("Scheduler started") def shutdown_scheduler(): """Shutdown the scheduler gracefully.""" if scheduler.running: scheduler.shutdown(wait=False) logger.info("Scheduler shutdown")