gmao/migrations/versions/o0d1e2f3g4h5_meter_reading_c2.py

130 lines
7.7 KiB
Python
Raw Normal View History

"""Checkpoint C2: règles, occurrences et tournées de relevés."""
from alembic import op
import sqlalchemy as sa
revision = "o0d1e2f3g4h5"
down_revision = "n9c0d1e2f3g4"
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
"meter_reading_schedules",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("meter_id", sa.Integer(), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=False, server_default="1"),
sa.Column("frequency", sa.String(30), nullable=False),
sa.Column("reference_date", sa.Date(), nullable=False),
sa.Column("target_time", sa.Time(), nullable=True),
sa.Column("duration_minutes", sa.Integer(), nullable=False, server_default="5"),
sa.Column("assigned_to_id", sa.Integer(), nullable=True),
sa.Column("closed_day_policy", sa.String(30), nullable=False, server_default="PREVIOUS_WORKING_DAY"),
sa.Column("calendar_scope", sa.String(20), nullable=False, server_default="school"),
sa.Column("fixed_month", sa.Integer(), nullable=True),
sa.Column("fixed_day", sa.Integer(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["meter_id"], ["meters.id"], ondelete="CASCADE"),
sa.ForeignKeyConstraint(["assigned_to_id"], ["users.id"], ondelete="SET NULL"),
sa.UniqueConstraint("meter_id", name="uq_meter_reading_schedule_meter"),
sa.CheckConstraint("frequency in ('WEEKLY', 'MONTHLY', 'SEMI_ANNUAL', 'ANNUAL', 'FIXED_ANNUAL_DATE')", name="ck_meter_reading_schedule_frequency"),
)
op.create_index("ix_meter_reading_schedules_meter_id", "meter_reading_schedules", ["meter_id"])
op.create_index("ix_meter_reading_schedules_assigned_to_id", "meter_reading_schedules", ["assigned_to_id"])
op.create_table(
"meter_reading_rounds",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("name", sa.String(255), nullable=False),
sa.Column("is_active", sa.Boolean(), nullable=False, server_default="1"),
sa.Column("default_assigned_to_id", sa.Integer(), nullable=True),
sa.Column("estimated_duration_minutes", sa.Integer(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["default_assigned_to_id"], ["users.id"], ondelete="SET NULL"),
)
op.create_index("ix_meter_reading_rounds_default_assigned_to_id", "meter_reading_rounds", ["default_assigned_to_id"])
op.create_table(
"meter_reading_round_members",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("round_id", sa.Integer(), nullable=False),
sa.Column("schedule_id", sa.Integer(), nullable=False),
sa.Column("position", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(["round_id"], ["meter_reading_rounds.id"], ondelete="CASCADE"),
sa.ForeignKeyConstraint(["schedule_id"], ["meter_reading_schedules.id"], ondelete="CASCADE"),
sa.UniqueConstraint("round_id", "schedule_id", name="uq_meter_round_schedule"),
sa.UniqueConstraint("round_id", "position", name="uq_meter_round_position"),
)
op.create_index("ix_meter_reading_round_members_round_id", "meter_reading_round_members", ["round_id"])
op.create_index("ix_meter_reading_round_members_schedule_id", "meter_reading_round_members", ["schedule_id"])
op.create_table(
"meter_reading_round_occurrences",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("round_id", sa.Integer(), nullable=False),
sa.Column("operational_date", sa.Date(), nullable=False),
sa.Column("status", sa.String(30), nullable=False, server_default="À FAIRE"),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["round_id"], ["meter_reading_rounds.id"], ondelete="CASCADE"),
sa.UniqueConstraint("round_id", "operational_date", name="uq_meter_round_occurrence_date"),
)
op.create_index("ix_meter_reading_round_occurrences_round_id", "meter_reading_round_occurrences", ["round_id"])
op.create_index("ix_meter_reading_round_occurrences_operational_date", "meter_reading_round_occurrences", ["operational_date"])
op.create_table(
"meter_reading_occurrences",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("schedule_id", sa.Integer(), nullable=False),
sa.Column("target_date", sa.Date(), nullable=False),
sa.Column("operational_date", sa.Date(), nullable=False),
sa.Column("status", sa.String(30), nullable=False, server_default="À FAIRE"),
sa.Column("assigned_to_id", sa.Integer(), nullable=True),
sa.Column("meter_reading_id", sa.Integer(), nullable=True),
sa.Column("round_occurrence_id", sa.Integer(), nullable=True),
sa.Column("processed_by_id", sa.Integer(), nullable=True),
sa.Column("processed_at", sa.DateTime(), nullable=True),
sa.Column("no_reading_reason", sa.String(40), nullable=True),
sa.Column("comment", sa.Text(), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["schedule_id"], ["meter_reading_schedules.id"], ondelete="CASCADE"),
sa.ForeignKeyConstraint(["assigned_to_id"], ["users.id"], ondelete="SET NULL"),
sa.ForeignKeyConstraint(["meter_reading_id"], ["meter_readings.id"], ondelete="SET NULL"),
sa.ForeignKeyConstraint(["round_occurrence_id"], ["meter_reading_round_occurrences.id"], ondelete="SET NULL"),
sa.ForeignKeyConstraint(["processed_by_id"], ["users.id"], ondelete="SET NULL"),
sa.UniqueConstraint("schedule_id", "target_date", name="uq_meter_reading_occurrence_target"),
)
for name, column in (
("schedule_id", "schedule_id"), ("target_date", "target_date"),
("operational_date", "operational_date"), ("assigned_to_id", "assigned_to_id"),
("meter_reading_id", "meter_reading_id"), ("round_occurrence_id", "round_occurrence_id"),
("processed_by_id", "processed_by_id"),
):
op.create_index(f"ix_meter_reading_occurrences_{name}", "meter_reading_occurrences", [column])
def downgrade():
for name in (
"ix_meter_reading_occurrences_processed_by_id", "ix_meter_reading_occurrences_round_occurrence_id",
"ix_meter_reading_occurrences_meter_reading_id", "ix_meter_reading_occurrences_assigned_to_id",
"ix_meter_reading_occurrences_operational_date", "ix_meter_reading_occurrences_target_date",
"ix_meter_reading_occurrences_schedule_id",
):
op.drop_index(name, table_name="meter_reading_occurrences")
op.drop_table("meter_reading_occurrences")
op.drop_index("ix_meter_reading_round_occurrences_operational_date", table_name="meter_reading_round_occurrences")
op.drop_index("ix_meter_reading_round_occurrences_round_id", table_name="meter_reading_round_occurrences")
op.drop_table("meter_reading_round_occurrences")
op.drop_index("ix_meter_reading_round_members_schedule_id", table_name="meter_reading_round_members")
op.drop_index("ix_meter_reading_round_members_round_id", table_name="meter_reading_round_members")
op.drop_table("meter_reading_round_members")
op.drop_index("ix_meter_reading_rounds_default_assigned_to_id", table_name="meter_reading_rounds")
op.drop_table("meter_reading_rounds")
op.drop_index("ix_meter_reading_schedules_assigned_to_id", table_name="meter_reading_schedules")
op.drop_index("ix_meter_reading_schedules_meter_id", table_name="meter_reading_schedules")
op.drop_table("meter_reading_schedules")