"""sprint5_6_models

Revision ID: 799270d64f52
Revises: 8049f0a6564e
Create Date: 2026-07-10 21:47:34.910624

"""
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 = '799270d64f52'
down_revision: Union[str, None] = '8049f0a6564e'
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('quote_line_item',
    sa.Column('line_id', sa.UUID(), nullable=False),
    sa.Column('quote_id', sa.UUID(), nullable=False),
    sa.Column('item_type', sa.String(length=50), nullable=False),
    sa.Column('description', sa.String(length=200), nullable=False),
    sa.Column('quantity', sa.Integer(), nullable=False),
    sa.Column('unit_price', sa.Float(), nullable=False),
    sa.Column('line_total', sa.Float(), nullable=False),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], ),
    sa.PrimaryKeyConstraint('line_id')
    )
    op.drop_table('da_lite_hold_log')
    op.drop_table('sales_activity_log')
    op.drop_table('quote_configuration')
    op.drop_index('ix_customer_contact_contact_id', table_name='customer_contact')
    op.drop_table('customer_contact')
    op.add_column('build_order', sa.Column('payment_status', sa.String(length=20), server_default='PENDING', nullable=False))
    op.execute('UPDATE build_order SET balance_due = 0.0 WHERE balance_due IS NULL')
    op.alter_column('build_order', 'balance_due',
               existing_type=sa.DOUBLE_PRECISION(precision=53),
               server_default='0.0',
               nullable=False)
    op.drop_column('build_order', 'base_price')
    op.drop_column('build_order', 'total_amount')
    op.add_column('quote_bom_snapshot', sa.Column('snapshot_id', sa.UUID(), nullable=False))
    op.alter_column('quote_bom_snapshot', 'rm_id',
               existing_type=sa.UUID(),
               nullable=False)
    op.drop_column('quote_bom_snapshot', 'bom_line_id')
    op.drop_column('quote_bom_snapshot', 'item_description')
    op.drop_column('quote_bom_snapshot', 'item_code')
    op.add_column('quote_header', sa.Column('total_base_amount', sa.Float(), nullable=False))
    op.add_column('quote_header', sa.Column('total_taxes', sa.Float(), nullable=False))
    op.add_column('quote_header', sa.Column('final_amount', sa.Float(), nullable=False))
    op.add_column('quote_header', sa.Column('approved_by', sa.UUID(), nullable=True))
    op.add_column('quote_header', sa.Column('revision_number', sa.Integer(), nullable=True))
    op.alter_column('quote_header', 'valid_until',
               existing_type=sa.DATE(),
               type_=sa.DateTime(),
               existing_nullable=True)
    op.alter_column('quote_header', 'created_by',
               existing_type=sa.UUID(),
               nullable=False)
    op.drop_constraint('quote_header_quote_number_key', 'quote_header', type_='unique')
    op.create_foreign_key(None, 'quote_header', 'login_users', ['created_by'], ['user_id'])
    op.create_foreign_key(None, 'quote_header', 'login_users', ['approved_by'], ['user_id'])
    op.drop_column('quote_header', 'notes')
    op.drop_column('quote_header', 'discount_pct')
    op.drop_column('quote_header', 'total_amount')
    op.drop_column('quote_header', 'locked_at')
    op.drop_column('quote_header', 'discount_amount')
    op.drop_column('quote_header', 'bom_class')
    op.drop_column('quote_header', 'discount_reason')
    op.drop_column('quote_header', 'gst_amount')
    op.drop_column('quote_header', 'goodwill_approved_by')
    op.drop_column('quote_header', 'quote_date')
    op.drop_column('quote_header', 'gst_pct')
    op.drop_column('quote_header', 'subtotal')
    op.drop_column('quote_header', 'base_price')
    op.drop_column('quote_header', 'feature_price')
    op.drop_column('quote_header', 'goodwill_approved_at')
    op.drop_column('quote_header', 'chassis_model')
    op.drop_column('quote_header', 'quote_number')
    op.drop_column('quote_header', 'bus_use')
    op.drop_column('quote_header', 'body_type')
    op.drop_column('quote_header', 'quote_type')
    op.drop_column('quote_header', 'is_goodwill')
    op.add_column('sales_enquiry', sa.Column('request_details', sa.Text(), nullable=False))
    op.alter_column('sales_enquiry', 'customer_id',
               existing_type=sa.VARCHAR(length=50),
               nullable=False)
    op.alter_column('sales_enquiry', 'created_by',
               existing_type=sa.UUID(),
               nullable=False)
    op.drop_constraint('sales_enquiry_enquiry_number_key', 'sales_enquiry', type_='unique')
    op.create_foreign_key(None, 'sales_enquiry', 'login_users', ['created_by'], ['user_id'])
    op.drop_column('sales_enquiry', 'enquiry_type')
    op.drop_column('sales_enquiry', 'enquiry_date')
    op.drop_column('sales_enquiry', 'walk_in_phone')
    op.drop_column('sales_enquiry', 'follow_up_date')
    op.drop_column('sales_enquiry', 'source')
    op.drop_column('sales_enquiry', 'enquiry_number')
    op.drop_column('sales_enquiry', 'requirements')
    op.drop_column('sales_enquiry', 'walk_in_name')
    op.drop_column('sales_enquiry', 'remarks')
    op.add_column('service_order', sa.Column('order_id', sa.UUID(), nullable=True))
    op.drop_index('ix_service_order_order_number', table_name='service_order')
    op.create_foreign_key(None, 'service_order', 'build_order', ['order_id'], ['order_id'])
    op.drop_column('service_order', 'order_number')
    op.add_column('spare_parts_order', sa.Column('payment_status', sa.String(length=20), nullable=False))
    op.add_column('spare_parts_order', sa.Column('created_by', sa.UUID(), nullable=False))
    op.drop_index('ix_spare_parts_order_order_number', table_name='spare_parts_order')
    op.create_foreign_key(None, 'spare_parts_order', 'login_users', ['created_by'], ['user_id'])
    op.drop_column('spare_parts_order', 'order_number')
    op.add_column('spare_parts_order_detail', sa.Column('rm_id', sa.UUID(), nullable=False))
    op.add_column('spare_parts_order_detail', sa.Column('qty', sa.Float(), nullable=False))
    op.add_column('spare_parts_order_detail', sa.Column('line_amount', sa.Float(), nullable=False))
    op.create_foreign_key(None, 'spare_parts_order_detail', 'rm_master', ['rm_id'], ['rm_id'])
    op.drop_column('spare_parts_order_detail', 'quantity')
    op.drop_column('spare_parts_order_detail', 'total_price')
    op.drop_column('spare_parts_order_detail', 'item_id')
    op.add_column('transport_master', sa.Column('vehicle_type', sa.String(length=50), nullable=True))
    op.add_column('transport_master', sa.Column('active', sa.Boolean(), nullable=True))
    op.alter_column('transport_master', 'contact_number',
               existing_type=sa.VARCHAR(length=50),
               type_=sa.String(length=20),
               existing_nullable=True)
    op.drop_column('transport_master', 'is_active')
    op.drop_column('transport_master', 'updated_at')
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('transport_master', sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True))
    op.add_column('transport_master', sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=True))
    op.alter_column('transport_master', 'contact_number',
               existing_type=sa.String(length=20),
               type_=sa.VARCHAR(length=50),
               existing_nullable=True)
    op.drop_column('transport_master', 'active')
    op.drop_column('transport_master', 'vehicle_type')
    op.add_column('spare_parts_order_detail', sa.Column('item_id', sa.VARCHAR(length=50), autoincrement=False, nullable=False))
    op.add_column('spare_parts_order_detail', sa.Column('total_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False))
    op.add_column('spare_parts_order_detail', sa.Column('quantity', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False))
    op.drop_constraint(None, 'spare_parts_order_detail', type_='foreignkey')
    op.drop_column('spare_parts_order_detail', 'line_amount')
    op.drop_column('spare_parts_order_detail', 'qty')
    op.drop_column('spare_parts_order_detail', 'rm_id')
    op.add_column('spare_parts_order', sa.Column('order_number', sa.VARCHAR(length=50), autoincrement=False, nullable=False))
    op.drop_constraint(None, 'spare_parts_order', type_='foreignkey')
    op.create_index('ix_spare_parts_order_order_number', 'spare_parts_order', ['order_number'], unique=True)
    op.drop_column('spare_parts_order', 'created_by')
    op.drop_column('spare_parts_order', 'payment_status')
    op.add_column('service_order', sa.Column('order_number', sa.VARCHAR(length=50), autoincrement=False, nullable=False))
    op.drop_constraint(None, 'service_order', type_='foreignkey')
    op.create_index('ix_service_order_order_number', 'service_order', ['order_number'], unique=True)
    op.drop_column('service_order', 'order_id')
    op.add_column('sales_enquiry', sa.Column('remarks', sa.TEXT(), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('walk_in_name', sa.VARCHAR(length=255), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('requirements', sa.TEXT(), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('enquiry_number', sa.VARCHAR(length=50), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('source', sa.VARCHAR(length=30), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('follow_up_date', sa.DATE(), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('walk_in_phone', sa.VARCHAR(length=20), autoincrement=False, nullable=True))
    op.add_column('sales_enquiry', sa.Column('enquiry_date', sa.DATE(), autoincrement=False, nullable=False))
    op.add_column('sales_enquiry', sa.Column('enquiry_type', sa.VARCHAR(length=20), autoincrement=False, nullable=False))
    op.drop_constraint(None, 'sales_enquiry', type_='foreignkey')
    op.create_unique_constraint('sales_enquiry_enquiry_number_key', 'sales_enquiry', ['enquiry_number'])
    op.alter_column('sales_enquiry', 'created_by',
               existing_type=sa.UUID(),
               nullable=True)
    op.alter_column('sales_enquiry', 'customer_id',
               existing_type=sa.VARCHAR(length=50),
               nullable=True)
    op.drop_column('sales_enquiry', 'request_details')
    op.add_column('quote_header', sa.Column('is_goodwill', sa.BOOLEAN(), autoincrement=False, nullable=False))
    op.add_column('quote_header', sa.Column('quote_type', sa.VARCHAR(length=20), autoincrement=False, nullable=False))
    op.add_column('quote_header', sa.Column('body_type', sa.VARCHAR(length=50), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('bus_use', sa.VARCHAR(length=20), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('quote_number', sa.VARCHAR(length=50), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('chassis_model', sa.VARCHAR(length=50), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('goodwill_approved_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('feature_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('base_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('subtotal', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('gst_pct', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('quote_date', sa.DATE(), autoincrement=False, nullable=False))
    op.add_column('quote_header', sa.Column('goodwill_approved_by', sa.UUID(), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('gst_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('discount_reason', sa.TEXT(), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('bom_class', sa.VARCHAR(length=5), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('discount_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('locked_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('total_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('discount_pct', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('quote_header', sa.Column('notes', sa.TEXT(), autoincrement=False, nullable=True))
    op.drop_constraint(None, 'quote_header', type_='foreignkey')
    op.drop_constraint(None, 'quote_header', type_='foreignkey')
    op.create_unique_constraint('quote_header_quote_number_key', 'quote_header', ['quote_number'])
    op.alter_column('quote_header', 'created_by',
               existing_type=sa.UUID(),
               nullable=True)
    op.alter_column('quote_header', 'valid_until',
               existing_type=sa.DateTime(),
               type_=sa.DATE(),
               existing_nullable=True)
    op.drop_column('quote_header', 'revision_number')
    op.drop_column('quote_header', 'approved_by')
    op.drop_column('quote_header', 'final_amount')
    op.drop_column('quote_header', 'total_taxes')
    op.drop_column('quote_header', 'total_base_amount')
    op.add_column('quote_bom_snapshot', sa.Column('item_code', sa.VARCHAR(length=100), autoincrement=False, nullable=False))
    op.add_column('quote_bom_snapshot', sa.Column('item_description', sa.VARCHAR(length=255), autoincrement=False, nullable=True))
    op.add_column('quote_bom_snapshot', sa.Column('bom_line_id', sa.UUID(), autoincrement=False, nullable=False))
    op.alter_column('quote_bom_snapshot', 'rm_id',
               existing_type=sa.UUID(),
               nullable=True)
    op.drop_column('quote_bom_snapshot', 'snapshot_id')
    op.add_column('build_order', sa.Column('total_amount', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.add_column('build_order', sa.Column('base_price', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True))
    op.alter_column('build_order', 'balance_due',
               existing_type=sa.DOUBLE_PRECISION(precision=53),
               nullable=True)
    op.drop_column('build_order', 'payment_status')
    op.create_table('customer_contact',
    sa.Column('contact_id', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('customer_id', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('designation', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('email', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
    sa.Column('phone', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('is_primary', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['customer_id'], ['customer_master.customer_id'], name='customer_contact_customer_id_fkey'),
    sa.PrimaryKeyConstraint('contact_id', name='customer_contact_pkey')
    )
    op.create_index('ix_customer_contact_contact_id', 'customer_contact', ['contact_id'], unique=False)
    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=30), autoincrement=False, nullable=False),
    sa.Column('feature_code', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('feature_value', sa.VARCHAR(length=50), autoincrement=False, nullable=True),
    sa.Column('feature_label', sa.VARCHAR(length=150), autoincrement=False, nullable=True),
    sa.Column('is_mandatory', sa.BOOLEAN(), autoincrement=False, nullable=False),
    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('sales_activity_log',
    sa.Column('log_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('entity_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('entity_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('activity_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('old_value', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
    sa.Column('new_value', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
    sa.Column('remarks', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('performed_by', sa.UUID(), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('log_id', name='sales_activity_log_pkey')
    )
    op.create_table('da_lite_hold_log',
    sa.Column('log_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('order_id', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('action', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
    sa.Column('reason', sa.TEXT(), autoincrement=False, nullable=False),
    sa.Column('performed_by', sa.UUID(), autoincrement=False, nullable=False),
    sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['order_id'], ['build_order.order_id'], name='da_lite_hold_log_order_id_fkey'),
    sa.PrimaryKeyConstraint('log_id', name='da_lite_hold_log_pkey')
    )
    op.drop_table('quote_line_item')
    # ### end Alembic commands ###
