diff --git a/attendance/scheduler.py b/attendance/scheduler.py index eadc16a1c..f5cc38b0f 100644 --- a/attendance/scheduler.py +++ b/attendance/scheduler.py @@ -1,35 +1,50 @@ import datetime import sys +import pytz from apscheduler.schedulers.background import BackgroundScheduler +from django.conf import settings -today = datetime.datetime.today() +from base.backends import logger -def create_work_record(date=today): +def create_work_record(): from attendance.models import WorkRecords from employee.models import Employee - work_records = WorkRecords.objects.all() - employees = Employee.objects.all() - if len(work_records.filter(date=date)) == len(employees): - return - else: - for employee in employees: - try: - shift = employee.employee_work_info.shift_id + date = datetime.datetime.today() + work_records = WorkRecords.objects.filter(date=date).values_list( + "employee_id", flat=True + ) + employees = Employee.objects.exclude(id__in=work_records) + records_to_create = [] - WorkRecords.objects.get_or_create( - employee_id=employee, - date=date, - defaults={ - "work_record_type": "DFT", - "shift_id": shift, - "message": "", - }, - ) - except: - pass + for employee in employees: + try: + shift_schedule = employee.get_shift_schedule() + if shift_schedule is None: + continue + + shift = employee.get_shift() + record = WorkRecords( + employee_id=employee, + date=date, + work_record_type="DFT", + shift_id=shift, + message="", + ) + records_to_create.append(record) + except Exception as e: + logger.error(f"Error preparing work record for {employee}: {e}") + + if records_to_create: + try: + WorkRecords.objects.bulk_create(records_to_create) + print(f"Created {len(records_to_create)} work records for {date}.") + except Exception as e: + logger.error(f"Failed to bulk create work records: {e}") + else: + print(f"No new work records to create for {date}.") if not any( @@ -39,12 +54,19 @@ if not any( """ Initializes and starts background tasks using APScheduler when the server is running. """ - scheduler = BackgroundScheduler() + scheduler = BackgroundScheduler(timezone=pytz.timezone(settings.TIME_ZONE)) + scheduler.add_job( - create_work_record, "interval", hours=3, misfire_grace_time=3600 * 3 + create_work_record, "interval", minutes=30, misfire_grace_time=3600 * 3 ) scheduler.add_job( - create_work_record, "cron", hour=0, minute=30, misfire_grace_time=3600 * 9 + create_work_record, + "cron", + hour=0, + minute=30, + misfire_grace_time=3600 * 9, + id="create_daily_work_record", + replace_existing=True, ) scheduler.start()