"""sprint3_quote_tables

Revision ID: e429c1001e80
Revises: c5f68c1e84bd
Create Date: 2026-07-10 14:26:30.366525

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'e429c1001e80'
down_revision: Union[str, None] = 'c5f68c1e84bd'
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('sales_enquiry',
    sa.Column('enquiry_id', sa.UUID(), nullable=False),
    sa.Column('enquiry_number', sa.String(length=50), nullable=True),
    sa.Column('customer_id', sa.String(length=50), nullable=True),
    sa.Column('walk_in_name', sa.String(length=255), nullable=True),
    sa.Column('walk_in_phone', sa.String(length=20), nullable=True),
    sa.Column('enquiry_type', sa.String(length=20), nullable=False),
    sa.Column('enquiry_date', sa.Date(), nullable=False),
    sa.Column('requirements', sa.Text(), nullable=True),
    sa.Column('source', sa.String(length=30), nullable=True),
    sa.Column('assigned_to', sa.UUID(), nullable=True),
    sa.Column('status', sa.String(length=20), nullable=False),
    sa.Column('follow_up_date', sa.Date(), nullable=True),
    sa.Column('remarks', sa.Text(), nullable=True),
    sa.Column('created_by', sa.UUID(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=True),
    sa.Column('updated_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['assigned_to'], ['login_users.user_id'], ),
    sa.ForeignKeyConstraint(['customer_id'], ['customer_master.customer_id'], ),
    sa.PrimaryKeyConstraint('enquiry_id'),
    sa.UniqueConstraint('enquiry_number')
    )
    op.create_table('quote_header',
    sa.Column('quote_id', sa.UUID(), nullable=False),
    sa.Column('quote_number', sa.String(length=50), nullable=True),
    sa.Column('enquiry_id', sa.UUID(), nullable=True),
    sa.Column('customer_id', sa.String(length=50), nullable=False),
    sa.Column('quote_type', sa.String(length=20), nullable=False),
    sa.Column('quote_date', sa.Date(), nullable=False),
    sa.Column('valid_until', sa.Date(), nullable=True),
    sa.Column('status', sa.String(length=20), nullable=False),
    sa.Column('chassis_model', sa.String(length=50), nullable=True),
    sa.Column('body_type', sa.String(length=50), nullable=True),
    sa.Column('bus_use', sa.String(length=20), nullable=True),
    sa.Column('bom_class', sa.String(length=5), nullable=True),
    sa.Column('base_price', sa.Float(), nullable=True),
    sa.Column('feature_price', sa.Float(), nullable=True),
    sa.Column('subtotal', sa.Float(), nullable=True),
    sa.Column('discount_pct', sa.Float(), nullable=True),
    sa.Column('discount_amount', sa.Float(), nullable=True),
    sa.Column('discount_reason', sa.Text(), nullable=True),
    sa.Column('gst_pct', sa.Float(), nullable=True),
    sa.Column('gst_amount', sa.Float(), nullable=True),
    sa.Column('total_amount', sa.Float(), nullable=True),
    sa.Column('is_goodwill', sa.Boolean(), nullable=False),
    sa.Column('goodwill_approved_by', sa.UUID(), nullable=True),
    sa.Column('goodwill_approved_at', sa.DateTime(), nullable=True),
    sa.Column('locked_at', sa.DateTime(), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_by', sa.UUID(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=True),
    sa.Column('updated_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['customer_id'], ['customer_master.customer_id'], ),
    sa.ForeignKeyConstraint(['enquiry_id'], ['sales_enquiry.enquiry_id'], ),
    sa.PrimaryKeyConstraint('quote_id'),
    sa.UniqueConstraint('quote_number')
    )
    op.create_table('quote_bom_snapshot',
    sa.Column('bom_line_id', sa.UUID(), nullable=False),
    sa.Column('quote_id', sa.UUID(), nullable=False),
    sa.Column('rm_id', sa.UUID(), nullable=True),
    sa.Column('item_code', sa.String(length=100), nullable=False),
    sa.Column('item_description', sa.String(length=255), nullable=True),
    sa.Column('station_code', sa.String(length=30), nullable=True),
    sa.Column('station_label', sa.String(length=100), nullable=True),
    sa.Column('production_day', sa.Integer(), nullable=True),
    sa.Column('required_qty', sa.Float(), nullable=False),
    sa.Column('unit_price', sa.Float(), nullable=True),
    sa.Column('line_amount', sa.Float(), nullable=True),
    sa.Column('line_source', sa.String(length=10), nullable=False),
    sa.Column('feature_code', sa.String(length=50), nullable=True),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], ),
    sa.ForeignKeyConstraint(['rm_id'], ['rm_master.rm_id'], ),
    sa.PrimaryKeyConstraint('bom_line_id')
    )
    op.create_table('quote_configuration',
    sa.Column('config_id', sa.UUID(), nullable=False),
    sa.Column('quote_id', sa.UUID(), nullable=False),
    sa.Column('feature_category', sa.String(length=30), nullable=False),
    sa.Column('feature_code', sa.String(length=50), nullable=False),
    sa.Column('feature_value', sa.String(length=50), nullable=True),
    sa.Column('feature_label', sa.String(length=150), nullable=True),
    sa.Column('is_mandatory', sa.Boolean(), nullable=False),
    sa.Column('price_impact', sa.Float(), nullable=True),
    sa.ForeignKeyConstraint(['quote_id'], ['quote_header.quote_id'], ),
    sa.PrimaryKeyConstraint('config_id')
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('quote_configuration')
    op.drop_table('quote_bom_snapshot')
    op.drop_table('quote_header')
    op.drop_table('sales_enquiry')
    # ### end Alembic commands ###
