"""schema inicial do motor de custeio

Revision ID: 811b8a8fef5a
Revises: 
Create Date: 2026-09-03 16:07:03.860942

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '811b8a8fef5a'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('ambiente',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.Column('valor_rateado_mensal', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('horas_uteis_mensais', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('custeio_execucao',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('executado_em', sa.DateTime(), nullable=False),
    sa.Column('observacao', sa.String(length=500), nullable=True),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('insumo',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.Column('tipo', sa.String(length=20), nullable=False),
    sa.Column('valor_compra_unitario', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('frete', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('ipi_pct', sa.Numeric(precision=6, scale=4), nullable=False),
    sa.Column('icms_pct', sa.Numeric(precision=6, scale=4), nullable=False),
    sa.CheckConstraint("tipo in ('ingrediente', 'embalagem')", name='ck_insumo_tipo'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('produto',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('nome', sa.String(length=300), nullable=False),
    sa.Column('tipo', sa.String(length=20), nullable=False),
    sa.Column('rendimento_kg', sa.Numeric(precision=14, scale=6), nullable=True),
    sa.Column('rendimento_un', sa.Numeric(precision=14, scale=6), nullable=True),
    sa.Column('qtd_estimada_producao_mes', sa.Numeric(precision=14, scale=6), nullable=True),
    sa.CheckConstraint("tipo in ('acabado', 'semi_acabado')", name='ck_produto_tipo'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('setor',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('custeio_produto',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('execucao_id', sa.Integer(), nullable=False),
    sa.Column('produto_id', sa.Integer(), nullable=False),
    sa.Column('custo_maquina', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('custo_ambiente', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('custo_mao_de_obra', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('custo_insumos', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('custo_total_unitario', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['execucao_id'], ['custeio_execucao.id'], ),
    sa.ForeignKeyConstraint(['produto_id'], ['produto.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('funcionario',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo_fopag', sa.String(length=20), nullable=False),
    sa.Column('setor_id', sa.Integer(), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.Column('cargo', sa.String(length=200), nullable=False),
    sa.Column('custo_mensal', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('horas_uteis_mensais', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['setor_id'], ['setor.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo_fopag')
    )
    op.create_table('maquina',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.Column('ambiente_id', sa.Integer(), nullable=True),
    sa.Column('setor_id', sa.Integer(), nullable=True),
    sa.Column('valor_compra', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('meses_depreciacao', sa.Integer(), nullable=False),
    sa.Column('manutencao_mensal', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('custo_energia_mensal', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.Column('horas_uteis_mensais', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['ambiente_id'], ['ambiente.id'], ),
    sa.ForeignKeyConstraint(['setor_id'], ['setor.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('processo',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('codigo', sa.String(length=20), nullable=False),
    sa.Column('setor_id', sa.Integer(), nullable=False),
    sa.Column('nome', sa.String(length=200), nullable=False),
    sa.ForeignKeyConstraint(['setor_id'], ['setor.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('codigo')
    )
    op.create_table('roteiro_ambiente',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('produto_id', sa.Integer(), nullable=False),
    sa.Column('processo_id', sa.Integer(), nullable=False),
    sa.Column('ordem', sa.Integer(), nullable=False),
    sa.Column('ambiente_id', sa.Integer(), nullable=False),
    sa.Column('tempo_horas', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['ambiente_id'], ['ambiente.id'], ),
    sa.ForeignKeyConstraint(['processo_id'], ['processo.id'], ),
    sa.ForeignKeyConstraint(['produto_id'], ['produto.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('roteiro_insumo',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('produto_id', sa.Integer(), nullable=False),
    sa.Column('processo_id', sa.Integer(), nullable=False),
    sa.Column('ordem', sa.Integer(), nullable=False),
    sa.Column('insumo_id', sa.Integer(), nullable=True),
    sa.Column('insumo_produto_id', sa.Integer(), nullable=True),
    sa.Column('quantidade_kg', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.CheckConstraint('(insumo_id IS NOT NULL) <> (insumo_produto_id IS NOT NULL)', name='ck_roteiro_insumo_fonte_unica'),
    sa.ForeignKeyConstraint(['insumo_id'], ['insumo.id'], ),
    sa.ForeignKeyConstraint(['insumo_produto_id'], ['produto.id'], ),
    sa.ForeignKeyConstraint(['processo_id'], ['processo.id'], ),
    sa.ForeignKeyConstraint(['produto_id'], ['produto.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('roteiro_mao_de_obra',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('produto_id', sa.Integer(), nullable=False),
    sa.Column('processo_id', sa.Integer(), nullable=False),
    sa.Column('ordem', sa.Integer(), nullable=False),
    sa.Column('funcionario_id', sa.Integer(), nullable=False),
    sa.Column('tempo_horas', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['funcionario_id'], ['funcionario.id'], ),
    sa.ForeignKeyConstraint(['processo_id'], ['processo.id'], ),
    sa.ForeignKeyConstraint(['produto_id'], ['produto.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('roteiro_maquina',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('produto_id', sa.Integer(), nullable=False),
    sa.Column('processo_id', sa.Integer(), nullable=False),
    sa.Column('ordem', sa.Integer(), nullable=False),
    sa.Column('maquina_id', sa.Integer(), nullable=False),
    sa.Column('tempo_horas', sa.Numeric(precision=14, scale=6), nullable=False),
    sa.ForeignKeyConstraint(['maquina_id'], ['maquina.id'], ),
    sa.ForeignKeyConstraint(['processo_id'], ['processo.id'], ),
    sa.ForeignKeyConstraint(['produto_id'], ['produto.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('roteiro_maquina')
    op.drop_table('roteiro_mao_de_obra')
    op.drop_table('roteiro_insumo')
    op.drop_table('roteiro_ambiente')
    op.drop_table('processo')
    op.drop_table('maquina')
    op.drop_table('funcionario')
    op.drop_table('custeio_produto')
    op.drop_table('setor')
    op.drop_table('produto')
    op.drop_table('insumo')
    op.drop_table('custeio_execucao')
    op.drop_table('ambiente')
    # ### end Alembic commands ###
