"""Stub entity tables — id + framework mixin columns only. Revision ID: 0004_stub_entity_tables Revises: 0003_registrants Create Date: 2026-10-01 Milestone 0.7. One table per Phase 0 stub entity (`src/ypms/stub_models.py`) so every entity can carry a retention policy. Domain phases add columns in new revisions; table names are stable. The table list is a literal on purpose — migrations must not import app code, or a later rename would silently rewrite history. Per repo rule (CONTRIBUTING.md): this file is immutable once merged. """ from __future__ import annotations from collections.abc import Sequence import sqlalchemy as sa from alembic import op revision: str = "0004_stub_entity_tables" down_revision: str | Sequence[str] | None = "0003_registrants" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None TABLES: tuple[str, ...] = ( "guardians", "consent_records", "hosts", "host_contacts", "worksites", "positions", "job_postings", "programs", "cohorts", "eligibility_rules", "applications", "eligibility_decisions", "certifications", "orientations", "enrollments", "time_entries", "timesheets", "payroll_batches", "tax_documents", "transportation_vouchers", "attachments", "notes", "integration_events", "notifications", "education_records", "foster_indicators", ) def upgrade() -> None: for table in TABLES: op.create_table( table, sa.Column("id", sa.Integer(), primary_key=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False), sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True), sa.Column("version", sa.Integer(), nullable=False, server_default=sa.text("1")), ) def downgrade() -> None: for table in reversed(TABLES): op.drop_table(table)