Files
Budget_Tool_Martinhal/backend/alembic/versions/0001_initial.py
T

122 lines
5.6 KiB
Python

"""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 ###