"""initial schema Revision ID: 0001 Revises: Create Date: 2026-10-28 20:51:51.396857 """ from alembic import op import sqlalchemy as sa revision = '0001' down_revision = None branch_labels = None depends_on = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('categories', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name_en', sa.String(length=200), nullable=False), sa.Column('name_pt', sa.String(length=200), nullable=False), sa.Column('section', sa.String(length=20), nullable=False), sa.Column('sort_order', sa.Integer(), nullable=False), sa.Column('show_when_empty', sa.Boolean(), nullable=False), sa.Column('active', sa.Boolean(), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('name_en') ) op.create_table('sites', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=120), nullable=False), sa.Column('active', sa.Boolean(), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('name') ) op.create_table('users', sa.Column('id', sa.Integer(), nullable=False), sa.Column('email', sa.String(length=255), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('password_hash', sa.String(length=255), nullable=False), sa.Column('role', sa.String(length=20), nullable=False), sa.Column('language', sa.String(length=5), nullable=False), sa.Column('active', sa.Boolean(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True) op.create_table('audit_log', sa.Column('id', sa.Integer(), nullable=False), sa.Column('at', sa.DateTime(timezone=True), nullable=False), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('year_id', sa.Integer(), nullable=True), sa.Column('entity', sa.String(length=40), nullable=False), sa.Column('entity_id', sa.Integer(), nullable=True), sa.Column('action', sa.String(length=40), nullable=False), sa.Column('summary', sa.String(length=500), nullable=False), sa.Column('changes', sa.JSON(), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_audit_log_at'), 'audit_log', ['at'], unique=False) op.create_index(op.f('ix_audit_log_year_id'), 'audit_log', ['year_id'], unique=False) op.create_table('budget_years', sa.Column('id', sa.Integer(), nullable=False), sa.Column('year', sa.Integer(), nullable=False), sa.Column('title', sa.String(length=200), nullable=False), sa.Column('default_rate', sa.Numeric(precision=9, scale=6), nullable=False), sa.Column('status', sa.String(length=20), nullable=False), sa.Column('notes', sa.Text(), nullable=False), sa.Column('submitted_by_id', sa.Integer(), nullable=True), sa.Column('submitted_at', sa.DateTime(timezone=True), nullable=True), sa.Column('approved_by_id', sa.Integer(), nullable=True), sa.Column('approved_at', sa.DateTime(timezone=True), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['approved_by_id'], ['users.id'], ), sa.ForeignKeyConstraint(['submitted_by_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('year') ) op.create_table('cost_lines', sa.Column('id', sa.Integer(), nullable=False), sa.Column('year_id', sa.Integer(), nullable=False), sa.Column('category_id', sa.Integer(), nullable=False), sa.Column('site_id', sa.Integer(), nullable=True), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('description', sa.String(length=500), nullable=False), sa.Column('remarks', sa.Text(), nullable=False), sa.Column('prior_expr', sa.String(length=500), nullable=False), sa.Column('prior_actual', sa.Numeric(precision=18, scale=6), nullable=False), sa.Column('base_expr', sa.String(length=500), nullable=False), sa.Column('base_amount', sa.Numeric(precision=18, scale=6), nullable=False), sa.Column('adj_kind', sa.String(length=20), nullable=False), sa.Column('adj_value', sa.Numeric(precision=12, scale=6), nullable=False), sa.Column('adj_reason', sa.String(length=255), nullable=False), sa.Column('monthly_kind', sa.String(length=10), nullable=False), sa.Column('monthly_values', sa.JSON(), nullable=True), sa.Column('sort_order', sa.Integer(), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['category_id'], ['categories.id'], ), sa.ForeignKeyConstraint(['site_id'], ['sites.id'], ), sa.ForeignKeyConstraint(['year_id'], ['budget_years.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_cost_lines_year_id'), 'cost_lines', ['year_id'], unique=False) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.drop_index(op.f('ix_cost_lines_year_id'), table_name='cost_lines') op.drop_table('cost_lines') op.drop_table('budget_years') op.drop_index(op.f('ix_audit_log_year_id'), table_name='audit_log') op.drop_index(op.f('ix_audit_log_at'), table_name='audit_log') op.drop_table('audit_log') op.drop_index(op.f('ix_users_email'), table_name='users') op.drop_table('users') op.drop_table('sites') op.drop_table('categories') # ### end Alembic commands ###