from pathlib import Path import sys from sqlalchemy import text ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) from app.database import engine # noqa: E402 from app.services.work_schedule import DEFAULT_WORK_SCHEDULE # noqa: E402 SCHEDULE_FIELDS = [ "day_start", "day_end", "lunch_start", "lunch_end", "dinner_start", "dinner_end", "overtime_start", "overtime_end", "night_start", "night_end", ] def column_exists(conn, table: str, column: str) -> bool: return bool(conn.execute(text(""" SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = :table AND column_name = :column """), {"table": table, "column": column}).scalar_one()) def main() -> None: with engine.begin() as conn: for field in SCHEDULE_FIELDS: if column_exists(conn, "attendance_points", field): continue conn.execute(text( f"ALTER TABLE attendance_points " f"ADD COLUMN {field} VARCHAR(5) NOT NULL DEFAULT :default_value AFTER radius_meters" ), {"default_value": DEFAULT_WORK_SCHEDULE[field]}) has_global_schedule = bool(conn.execute(text(""" SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'work_schedules' """)).scalar_one()) if has_global_schedule: set_clause = ", ".join( f"ap.{field} = COALESCE(ws.{field}, :{field})" for field in SCHEDULE_FIELDS ) conn.execute(text(f""" UPDATE attendance_points ap JOIN work_schedules ws ON ws.id = 1 SET {set_clause} """), DEFAULT_WORK_SCHEDULE) for field in SCHEDULE_FIELDS: conn.execute(text( f"UPDATE attendance_points SET {field} = :default_value " f"WHERE {field} IS NULL OR {field} = ''" ), {"default_value": DEFAULT_WORK_SCHEDULE[field]}) print("attendance point schedules migrated") if __name__ == "__main__": main()