"""add chassisbomsnapshot reserve metrics

Revision ID: 10d99a1df709
Revises: 8adbf991c6bf
Create Date: 2026-09-11 14:10:49.122535

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '10d99a1df709'
down_revision: Union[str, None] = '8adbf991c6bf'
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! ###
    conn = op.get_bind()
    inspector = sa.inspect(conn)
    existing_tables = inspector.get_table_names()

    if 'chassis_bom_snapshot' not in existing_tables:
        op.create_table(
            'chassis_bom_snapshot',
            sa.Column('id', sa.UUID(), nullable=False),
            sa.Column('chassis_id', sa.UUID(), nullable=False),
            sa.Column('rm_id', sa.UUID(), nullable=False),
            sa.Column('quantity', sa.Numeric(precision=14, scale=3), nullable=False),
            sa.Column('reserved_qty', sa.Numeric(precision=14, scale=3), server_default=sa.text('0'), nullable=False),
            sa.Column('consumed_qty', sa.Numeric(precision=14, scale=3), server_default=sa.text('0'), nullable=False),
            sa.Column('station_id', sa.UUID(), nullable=True),
            sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
            sa.ForeignKeyConstraint(['chassis_id'], ['chassis_master.chassis_id'], ondelete='CASCADE'),
            sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id']),
            sa.ForeignKeyConstraint(['station_id'], ['station_master.station_id']),
            sa.PrimaryKeyConstraint('id')
        )
    else:
        columns = [c['name'] for c in inspector.get_columns('chassis_bom_snapshot')]
        if 'reserved_qty' not in columns:
            op.add_column('chassis_bom_snapshot', sa.Column('reserved_qty', sa.Numeric(precision=14, scale=3), server_default=sa.text('0'), nullable=False))
        if 'consumed_qty' not in columns:
            op.add_column('chassis_bom_snapshot', sa.Column('consumed_qty', sa.Numeric(precision=14, scale=3), server_default=sa.text('0'), nullable=False))
        if 'station_id' not in columns:
            op.add_column('chassis_bom_snapshot', sa.Column('station_id', sa.UUID(), nullable=True))
            op.create_foreign_key(None, 'chassis_bom_snapshot', 'station_master', ['station_id'], ['station_id'])

    if 'customer_payment_log' in existing_tables and 'dealer_order' in existing_tables:
        try:
            op.create_foreign_key(None, 'customer_payment_log', 'dealer_order', ['order_id'], ['order_id'])
        except Exception:
            pass
    if 'da_lite_hold_log' in existing_tables and 'dealer_order' in existing_tables:
        try:
            op.create_foreign_key(None, 'da_lite_hold_log', 'dealer_order', ['order_id'], ['order_id'])
        except Exception:
            pass
    if 'payment_receipt' in existing_tables and 'dealer_order' in existing_tables:
        try:
            op.create_foreign_key(None, 'payment_receipt', 'dealer_order', ['order_id'], ['order_id'])
        except Exception:
            pass
    if 'service_order' in existing_tables and 'dealer_order' in existing_tables:
        try:
            op.create_foreign_key(None, 'service_order', 'dealer_order', ['order_id'], ['order_id'])
        except Exception:
            pass
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
#     op.drop_constraint(None, 'service_order', type_='foreignkey')
    op.create_foreign_key('service_order_order_id_fkey', 'service_order', 'build_order', ['order_id'], ['order_id'])
#     op.drop_constraint(None, 'payment_receipt', type_='foreignkey')
    op.create_foreign_key('payment_receipt_order_id_fkey', 'payment_receipt', 'build_order', ['order_id'], ['order_id'])
    op.create_foreign_key('dealer_order_build_order_id_fkey', 'dealer_order', 'build_order', ['build_order_id'], ['order_id'])
#     op.drop_constraint(None, 'da_lite_hold_log', type_='foreignkey')
    op.create_foreign_key('da_lite_hold_log_order_id_fkey', 'da_lite_hold_log', 'build_order', ['order_id'], ['order_id'])
#     op.drop_constraint(None, 'customer_payment_log', type_='foreignkey')
    op.create_foreign_key('customer_payment_log_order_id_fkey', 'customer_payment_log', 'build_order', ['order_id'], ['order_id'])
    op.create_foreign_key('chassis_master_build_order_id_fkey', 'chassis_master', 'build_order', ['build_order_id'], ['order_id'])
    op.create_foreign_key('fk_chassis_build_spec', 'chassis_master', 'build_spec', ['build_spec_id'], ['spec_id'])
#     op.drop_constraint(None, 'chassis_bom_snapshot', type_='foreignkey')
#     op.drop_column('chassis_bom_snapshot', 'station_id')
#     op.drop_column('chassis_bom_snapshot', 'consumed_qty')
#     op.drop_column('chassis_bom_snapshot', 'reserved_qty')
    op.create_table('qa_checkpoint_spec_variant',
    sa.Column('variant_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('item_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('model_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('parameter_name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('spec_value', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('nominal', sa.NUMERIC(precision=10, scale=2), autoincrement=False, nullable=True),
    sa.Column('tolerance_plus', sa.NUMERIC(precision=10, scale=2), autoincrement=False, nullable=True),
    sa.Column('tolerance_minus', sa.NUMERIC(precision=10, scale=2), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['item_id'], ['qa_checkpoint_item.item_id'], name='qa_checkpoint_spec_variant_item_id_fkey', ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['model_id'], ['qa_bus_model_master.model_id'], name='qa_checkpoint_spec_variant_model_id_fkey'),
    sa.PrimaryKeyConstraint('variant_id', name='qa_checkpoint_spec_variant_pkey')
    )
    op.create_table('purchase_request',
    sa.Column('pr_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('pr_number', sa.VARCHAR(length=30), autoincrement=False, nullable=False),
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('rm_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('required_qty', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=False),
    sa.Column('shortage_qty', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=False),
    sa.Column('uom', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('priority', sa.VARCHAR(length=10), server_default=sa.text("'NORMAL'::character varying"), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), server_default=sa.text("'OPEN'::character varying"), autoincrement=False, nullable=False),
    sa.Column('po_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('raised_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('raised_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['order_id'], ['build_order.order_id'], name='purchase_request_order_id_fkey'),
    sa.ForeignKeyConstraint(['po_id'], ['rm_purchase_order.po_id'], name='purchase_request_po_id_fkey'),
    sa.ForeignKeyConstraint(['raised_by'], ['login_users.user_id'], name='purchase_request_raised_by_fkey'),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], name='purchase_request_rm_id_fkey'),
    sa.PrimaryKeyConstraint('pr_id', name='purchase_request_pkey'),
    sa.UniqueConstraint('pr_number', name='purchase_request_pr_number_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('feature_bom_mapping',
    sa.Column('mapping_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('feature_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('feature_option_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('rm_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('quantity', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=False),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['feature_id'], ['special_feature_master.feature_id'], name='feature_bom_mapping_feature_id_fkey'),
    sa.ForeignKeyConstraint(['feature_option_id'], ['special_feature_option_master.option_id'], name='feature_bom_mapping_feature_option_id_fkey'),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], name='feature_bom_mapping_rm_id_fkey'),
    sa.PrimaryKeyConstraint('mapping_id', name='feature_bom_mapping_pkey')
    )
    op.create_table('build_order_approval_log',
    sa.Column('log_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('gate', sa.VARCHAR(length=30), autoincrement=False, nullable=False),
    sa.Column('action', sa.VARCHAR(length=30), autoincrement=False, nullable=False),
    sa.Column('from_status', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('to_status', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('performed_by', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('performed_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('snapshot', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['order_id'], ['build_order.order_id'], name='build_order_approval_log_order_id_fkey'),
    sa.ForeignKeyConstraint(['performed_by'], ['login_users.user_id'], name='build_order_approval_log_performed_by_fkey'),
    sa.PrimaryKeyConstraint('log_id', name='build_order_approval_log_pkey')
    )
    op.create_table('quote_configuration',
    sa.Column('config_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('quote_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('feature_category', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('feature_code', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('feature_value', sa.VARCHAR(length=200), autoincrement=False, nullable=True),
    sa.Column('feature_label', sa.VARCHAR(length=200), autoincrement=False, nullable=True),
    sa.Column('is_mandatory', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.Column('price_impact', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], name='quote_configuration_quote_id_fkey'),
    sa.PrimaryKeyConstraint('config_id', name='quote_configuration_pkey')
    )
    op.create_table('build_spec_feature',
    sa.Column('feature_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('spec_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('feature_category', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('feature_code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('feature_name', sa.VARCHAR(length=150), autoincrement=False, nullable=False),
    sa.Column('feature_value', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('is_customer_supplied', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True),
    sa.Column('csp_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['csp_id'], ['customer_supplied_part.csp_id'], name='build_spec_feature_csp_id_fkey'),
    sa.ForeignKeyConstraint(['spec_id'], ['build_spec.spec_id'], name='build_spec_feature_spec_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('feature_id', name='build_spec_feature_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('quote_line_item',
    sa.Column('line_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('quote_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('item_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('description', sa.VARCHAR(length=200), autoincrement=False, nullable=False),
    sa.Column('quantity', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('unit_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('line_total', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], name='quote_line_item_quote_id_fkey'),
    sa.PrimaryKeyConstraint('line_id', name='quote_line_item_pkey')
    )
    op.create_table('build_spec',
    sa.Column('spec_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('chassis_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('enquiry_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('chassis_model', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('body_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('bus_use', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('seating_capacity', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('seating_layout', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('ac_type', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('door_config', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('tail_lamp_type', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('faps_config', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('special_requirements', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('bom_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), server_default=sa.text("'DRAFT'::character varying"), autoincrement=False, nullable=False),
    sa.Column('procurement_all_confirmed', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True),
    sa.Column('created_by', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('approved_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('approved_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('approval_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['approved_by'], ['login_users.user_id'], name='build_spec_approved_by_fkey'),
    sa.ForeignKeyConstraint(['bom_id'], ['bom_master.bom_id'], name='build_spec_bom_id_fkey'),
    sa.ForeignKeyConstraint(['chassis_id'], ['chassis_master.chassis_id'], name='build_spec_chassis_id_fkey'),
    sa.ForeignKeyConstraint(['created_by'], ['login_users.user_id'], name='build_spec_created_by_fkey'),
    sa.ForeignKeyConstraint(['enquiry_id'], ['sales_enquiry.enquiry_id'], name='build_spec_enquiry_id_fkey'),
    sa.PrimaryKeyConstraint('spec_id', name='build_spec_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('qa_checkpoint_response',
    sa.Column('response_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('instance_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('item_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('status', sa.VARCHAR(length=10), autoincrement=False, nullable=True),
    sa.Column('measured_value', sa.NUMERIC(precision=10, scale=2), autoincrement=False, nullable=True),
    sa.Column('observation', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('after_rework_status', sa.VARCHAR(length=10), autoincrement=False, nullable=True),
    sa.Column('after_rework_remarks', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('responded_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('responded_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['instance_id'], ['qa_checksheet_instance.instance_id'], name='qa_checkpoint_response_instance_id_fkey', ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['item_id'], ['qa_checkpoint_item.item_id'], name='qa_checkpoint_response_item_id_fkey'),
    sa.PrimaryKeyConstraint('response_id', name='qa_checkpoint_response_pkey')
    )
    op.create_table('qa_inspection_method_master',
    sa.Column('method_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.PrimaryKeyConstraint('method_id', name='qa_inspection_method_master_pkey'),
    sa.UniqueConstraint('code', name='qa_inspection_method_master_code_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('qa_sub_phase_master',
    sa.Column('phase_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.PrimaryKeyConstraint('phase_id', name='qa_sub_phase_master_pkey'),
    sa.UniqueConstraint('code', name='qa_sub_phase_master_code_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('qa_checksheet_instance',
    sa.Column('instance_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('template_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('model_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('chassis_no', sa.VARCHAR(length=30), autoincrement=False, nullable=False),
    sa.Column('face', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('inspection_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('special_features_text', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['model_id'], ['qa_bus_model_master.model_id'], name='qa_checksheet_instance_model_id_fkey'),
    sa.ForeignKeyConstraint(['template_id'], ['qa_checksheet_template.template_id'], name='qa_checksheet_instance_template_id_fkey'),
    sa.PrimaryKeyConstraint('instance_id', name='qa_checksheet_instance_pkey'),
    sa.UniqueConstraint('template_id', 'chassis_no', name='uq_qa_instance_template_chassis'),
    postgresql_ignore_search_path=False
    )
    op.create_table('build_spec_bom_line',
    sa.Column('line_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('spec_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('rm_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('feature_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('quantity_required', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=False),
    sa.Column('uom', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('procurement_source', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('is_customer_supplied', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True),
    sa.Column('source_type', sa.VARCHAR(length=20), server_default=sa.text("'BASE_BOM'::character varying"), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['feature_id'], ['build_spec_feature.feature_id'], name='build_spec_bom_line_feature_id_fkey'),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], name='build_spec_bom_line_rm_id_fkey'),
    sa.ForeignKeyConstraint(['spec_id'], ['build_spec.spec_id'], name='build_spec_bom_line_spec_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('line_id', name='build_spec_bom_line_pkey')
    )
    op.create_table('qa_checksheet_template',
    sa.Column('template_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('template_code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('template_name', sa.VARCHAR(length=255), autoincrement=False, nullable=False),
    sa.Column('station_code', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('format_no', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('revision', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('revision_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('has_paint_history', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.Column('has_frequency_col', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('updated_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('template_id', name='qa_checksheet_template_pkey'),
    sa.UniqueConstraint('template_code', name='qa_checksheet_template_template_code_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('qa_template_model_map',
    sa.Column('template_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('model_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['model_id'], ['qa_bus_model_master.model_id'], name='qa_template_model_map_model_id_fkey', ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['template_id'], ['qa_checksheet_template.template_id'], name='qa_template_model_map_template_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('template_id', 'model_id', name='qa_template_model_map_pkey')
    )
    op.create_table('procurement_category_approval',
    sa.Column('approval_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('spec_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('category', sa.VARCHAR(length=30), autoincrement=False, nullable=False),
    sa.Column('status', sa.VARCHAR(length=20), server_default=sa.text("'PENDING'::character varying"), autoincrement=False, nullable=False),
    sa.Column('expected_ready_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('blocked_reason', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('reviewed_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('reviewed_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['reviewed_by'], ['login_users.user_id'], name='procurement_category_approval_reviewed_by_fkey'),
    sa.ForeignKeyConstraint(['spec_id'], ['build_spec.spec_id'], name='procurement_category_approval_spec_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('approval_id', name='procurement_category_approval_pkey'),
    sa.UniqueConstraint('spec_id', 'category', name='uq_spec_category')
    )
    op.create_table('qa_checksheet_section',
    sa.Column('section_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('template_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('phase_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('section_code', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('section_name', sa.VARCHAR(length=255), autoincrement=False, nullable=False),
    sa.Column('section_number', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['phase_id'], ['qa_sub_phase_master.phase_id'], name='qa_checksheet_section_phase_id_fkey'),
    sa.ForeignKeyConstraint(['template_id'], ['qa_checksheet_template.template_id'], name='qa_checksheet_section_template_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('section_id', name='qa_checksheet_section_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('pre_production_hold',
    sa.Column('hold_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('blocker_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('resolved_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('resolved_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['order_id'], ['build_order.order_id'], name='pre_production_hold_order_id_fkey'),
    sa.PrimaryKeyConstraint('hold_id', name='pre_production_hold_pkey')
    )
    op.create_table('build_order_bom',
    sa.Column('bom_line_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('rm_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('required_qty', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=False),
    sa.Column('available_qty', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=True),
    sa.Column('shortage_qty', sa.NUMERIC(precision=14, scale=4), autoincrement=False, nullable=True),
    sa.Column('reserved_qty', sa.NUMERIC(precision=14, scale=4), server_default=sa.text("'0'::numeric"), autoincrement=False, nullable=True),
    sa.Column('uom', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('procurement_source', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('is_customer_supplied', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True),
    sa.Column('unit_cost', sa.NUMERIC(precision=14, scale=2), autoincrement=False, nullable=True),
    sa.Column('line_value', sa.NUMERIC(precision=14, scale=2), autoincrement=False, nullable=True),
    sa.Column('pr_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), server_default=sa.text("'PENDING'::character varying"), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['order_id'], ['build_order.order_id'], name='build_order_bom_order_id_fkey', ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['pr_id'], ['purchase_request.pr_id'], name='fk_bo_bom_pr'),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], name='build_order_bom_rm_id_fkey'),
    sa.PrimaryKeyConstraint('bom_line_id', name='build_order_bom_pkey')
    )
    op.create_table('production_capacity_config',
    sa.Column('config_id', sa.UUID(), server_default=sa.text('gen_random_uuid()'), autoincrement=False, nullable=False),
    sa.Column('station_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('max_wip', sa.INTEGER(), server_default=sa.text('3'), autoincrement=False, nullable=False),
    sa.Column('current_wip', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=False),
    sa.Column('avg_days_per_unit', sa.NUMERIC(precision=5, scale=1), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['station_id'], ['station_master.station_id'], name='production_capacity_config_station_id_fkey'),
    sa.PrimaryKeyConstraint('config_id', name='production_capacity_config_pkey'),
    sa.UniqueConstraint('station_id', name='production_capacity_config_station_id_key')
    )
    op.create_table('build_order',
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('order_number', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('quote_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('customer_id', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('chassis_no', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('chassis_model', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('body_type', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('bus_use', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('pre_production_status', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('da_lite_status', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('chassis_receive_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('induction_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('dispatch_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('contractor_group', sa.VARCHAR(length=10), autoincrement=False, nullable=True),
    sa.Column('ac_communication', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('driver_request_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('seat_fitting_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('document_pending', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('pdi_inspector', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('yard_location', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('assigned_to_name', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('remarks', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('balance_due', sa.DOUBLE_PRECISION(precision=53), server_default=sa.text("'0'::double precision"), autoincrement=False, nullable=False),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('receiving_transport_id', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('dispatch_transport_id', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('payment_status', sa.VARCHAR(length=20), server_default=sa.text("'PENDING'::character varying"), autoincrement=False, nullable=False),
    sa.Column('build_spec_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('procurement_status', sa.VARCHAR(length=30), server_default=sa.text("'PENDING'::character varying"), autoincrement=False, nullable=True),
    sa.Column('procurement_reviewed_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('procurement_reviewed_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('procurement_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('production_status', sa.VARCHAR(length=30), server_default=sa.text("'PENDING'::character varying"), autoincrement=False, nullable=True),
    sa.Column('production_reviewed_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('production_reviewed_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('production_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('target_start_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('estimated_completion_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('sales_released_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('sales_released_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('sales_release_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('total_bom_lines', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('total_shortage_lines', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('total_rm_value', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('bom_exploded_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('priority', sa.VARCHAR(length=10), server_default=sa.text("'NORMAL'::character varying"), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['build_spec_id'], ['build_spec.spec_id'], name='fk_bo_build_spec'),
    sa.ForeignKeyConstraint(['customer_id'], ['customer_master.customer_id'], name='build_order_customer_id_fkey'),
    sa.ForeignKeyConstraint(['dispatch_transport_id'], ['transport_master.transport_id'], name='build_order_dispatch_transport_id_fkey'),
    sa.ForeignKeyConstraint(['procurement_reviewed_by'], ['login_users.user_id'], name='fk_bo_proc_reviewer'),
    sa.ForeignKeyConstraint(['production_reviewed_by'], ['login_users.user_id'], name='fk_bo_prod_reviewer'),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], name='build_order_quote_id_fkey'),
    sa.ForeignKeyConstraint(['receiving_transport_id'], ['transport_master.transport_id'], name='build_order_receiving_transport_id_fkey'),
    sa.ForeignKeyConstraint(['sales_released_by'], ['login_users.user_id'], name='fk_bo_sales_releaser'),
    sa.PrimaryKeyConstraint('order_id', name='build_order_pkey'),
    sa.UniqueConstraint('order_number', name='build_order_order_number_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('qa_bus_model_master',
    sa.Column('model_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.PrimaryKeyConstraint('model_id', name='qa_bus_model_master_pkey'),
    sa.UniqueConstraint('code', name='qa_bus_model_master_code_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('quote_bom_snapshot',
    sa.Column('quote_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('rm_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('station_code', sa.VARCHAR(length=30), autoincrement=False, nullable=True),
    sa.Column('station_label', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('production_day', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('required_qty', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('unit_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('line_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('line_source', sa.VARCHAR(length=10), autoincrement=False, nullable=False),
    sa.Column('feature_code', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('snapshot_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], name='quote_bom_snapshot_quote_id_fkey'),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], name='quote_bom_snapshot_rm_id_fkey')
    )
    op.create_table('production_report_manual_entry',
    sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('chassis_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('contractor_group', sa.VARCHAR(length=10), autoincrement=False, nullable=True),
    sa.Column('ac_make', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('interior_work', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('driver_request', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('document_pending', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('seat_fitting_pending', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('remark', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['chassis_id'], ['chassis_master.chassis_id'], name='production_report_manual_entry_chassis_id_fkey'),
    sa.PrimaryKeyConstraint('id', name='production_report_manual_entry_pkey'),
    sa.UniqueConstraint('chassis_id', name='production_report_manual_entry_chassis_id_key')
    )
    op.create_table('qa_checkpoint_item',
    sa.Column('item_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('section_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('severity_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('method_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('item_number', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('description', sa.TEXT(), autoincrement=False, nullable=False),
    sa.Column('frequency', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('has_measurement', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.Column('measurement_unit', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('is_special_feature_slot', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.Column('sequence_no', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['method_id'], ['qa_inspection_method_master.method_id'], name='qa_checkpoint_item_method_id_fkey'),
    sa.ForeignKeyConstraint(['section_id'], ['qa_checksheet_section.section_id'], name='qa_checkpoint_item_section_id_fkey', ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['severity_id'], ['qa_severity_master.severity_id'], name='qa_checkpoint_item_severity_id_fkey'),
    sa.PrimaryKeyConstraint('item_id', name='qa_checkpoint_item_pkey')
    )
    op.create_table('quote_header',
    sa.Column('quote_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('enquiry_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('customer_id', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('valid_until', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('status', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('created_by', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('total_base_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('total_taxes', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('final_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('approved_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('revision_number', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('quote_number', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('quote_type', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('quote_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('chassis_model', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('body_type', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('bus_use', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('bom_class', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('ac_communication', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('driver_request_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('remarks', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('seat_fitting_notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('receiving_transport_id', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('dispatch_transport_id', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('base_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('feature_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('subtotal', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('discount_pct', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('discount_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('discount_reason', sa.VARCHAR(length=200), autoincrement=False, nullable=True),
    sa.Column('gst_pct', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('gst_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('total_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('is_goodwill', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['approved_by'], ['login_users.user_id'], name='quote_header_approved_by_fkey'),
    sa.ForeignKeyConstraint(['created_by'], ['login_users.user_id'], name='quote_header_created_by_fkey'),
    sa.ForeignKeyConstraint(['customer_id'], ['customer_master.customer_id'], name='quote_header_customer_id_fkey'),
    sa.ForeignKeyConstraint(['dispatch_transport_id'], ['transport_master.transport_id'], name='quote_header_dispatch_transport_id_fkey'),
    sa.ForeignKeyConstraint(['enquiry_id'], ['sales_enquiry.enquiry_id'], name='quote_header_enquiry_id_fkey'),
    sa.ForeignKeyConstraint(['receiving_transport_id'], ['transport_master.transport_id'], name='quote_header_receiving_transport_id_fkey'),
    sa.PrimaryKeyConstraint('quote_id', name='quote_header_pkey')
    )
    op.create_table('qa_paint_history_entry',
    sa.Column('entry_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('instance_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('history_type', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('painting_date', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('painting_shift', sa.VARCHAR(length=20), autoincrement=False, nullable=True),
    sa.Column('area_position', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('painter_name', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['instance_id'], ['qa_checksheet_instance.instance_id'], name='qa_paint_history_entry_instance_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('entry_id', name='qa_paint_history_entry_pkey')
    )
    op.create_table('qa_checksheet_signoff',
    sa.Column('signoff_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('instance_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('signoff_type', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('signed_by_user_id', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('signed_by_name', sa.VARCHAR(length=255), autoincrement=False, nullable=False),
    sa.Column('remarks', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('signed_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['instance_id'], ['qa_checksheet_instance.instance_id'], name='qa_checksheet_signoff_instance_id_fkey', ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('signoff_id', name='qa_checksheet_signoff_pkey')
    )
    op.create_table('qa_severity_master',
    sa.Column('severity_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('code', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('name', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('sequence_no', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=False),
    sa.PrimaryKeyConstraint('severity_id', name='qa_severity_master_pkey'),
    sa.UniqueConstraint('code', name='qa_severity_master_code_key')
    )
    # ### end Alembic commands ###
