"""add invoices

Revision ID: e6f7a8b9c0d1
Revises: d4e5f6a7b8c9
"""
from alembic import op
import sqlalchemy as sa
revision='e6f7a8b9c0d1'; down_revision='d4e5f6a7b8c9'; branch_labels=None; depends_on=None
def upgrade():
 op.create_table('invoices',sa.Column('id',sa.UUID(),primary_key=True),sa.Column('business_id',sa.UUID(),nullable=False),sa.Column('branch_id',sa.UUID()),sa.Column('customer_id',sa.UUID(),nullable=False),sa.Column('sale_id',sa.UUID()),sa.Column('invoice_number',sa.String(100),nullable=False),sa.Column('status',sa.String(20),nullable=False),sa.Column('issue_date',sa.Date(),nullable=False),sa.Column('due_date',sa.Date()),sa.Column('subtotal',sa.Numeric(14,2),nullable=False),sa.Column('discount',sa.Numeric(14,2),nullable=False),sa.Column('tax',sa.Numeric(14,2),nullable=False),sa.Column('total',sa.Numeric(14,2),nullable=False),sa.Column('amount_paid',sa.Numeric(14,2),nullable=False),sa.Column('balance',sa.Numeric(14,2),nullable=False),sa.Column('notes',sa.Text()),sa.Column('created_by',sa.UUID(),nullable=False),sa.Column('created_at',sa.DateTime(timezone=True),nullable=False),sa.Column('updated_at',sa.DateTime(timezone=True),nullable=False),sa.CheckConstraint('subtotal >= 0 AND discount >= 0 AND tax >= 0 AND total >= 0 AND amount_paid >= 0 AND balance >= 0',name='ck_invoice_nonnegative'),sa.ForeignKeyConstraint(['business_id'],['businesses.id'],ondelete='CASCADE'),sa.ForeignKeyConstraint(['branch_id'],['branches.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['customer_id'],['customers.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['sale_id'],['sales.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['created_by'],['users.id'],ondelete='RESTRICT'),sa.UniqueConstraint('business_id','invoice_number',name='uq_invoice_business_number'),sa.UniqueConstraint('sale_id',name='uq_invoice_sale'))
 op.create_index('ix_invoices_business_id','invoices',['business_id']);op.create_index('ix_invoices_branch_id','invoices',['branch_id']);op.create_index('ix_invoices_customer_id','invoices',['customer_id'])
 op.create_table('invoice_items',sa.Column('id',sa.UUID(),primary_key=True),sa.Column('invoice_id',sa.UUID(),nullable=False),sa.Column('product_id',sa.UUID()),sa.Column('variant_id',sa.UUID()),sa.Column('description',sa.String(500),nullable=False),sa.Column('quantity',sa.Numeric(14,4),nullable=False),sa.Column('unit_price',sa.Numeric(14,2),nullable=False),sa.Column('discount',sa.Numeric(14,2),nullable=False),sa.Column('line_total',sa.Numeric(14,2),nullable=False),sa.CheckConstraint('quantity > 0 AND unit_price >= 0 AND discount >= 0 AND line_total >= 0',name='ck_invoice_item_amounts'),sa.ForeignKeyConstraint(['invoice_id'],['invoices.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['product_id'],['products.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['variant_id'],['product_variants.id'],ondelete='RESTRICT'))
 op.create_index('ix_invoice_items_invoice_id','invoice_items',['invoice_id'])
 op.create_table('invoice_payments',sa.Column('id',sa.UUID(),primary_key=True),sa.Column('business_id',sa.UUID(),nullable=False),sa.Column('invoice_id',sa.UUID(),nullable=False),sa.Column('amount',sa.Numeric(14,2),nullable=False),sa.Column('payment_method',sa.String(20),nullable=False),sa.Column('reference',sa.String(150)),sa.Column('recorded_by',sa.UUID(),nullable=False),sa.Column('paid_at',sa.DateTime(timezone=True),nullable=False),sa.CheckConstraint('amount > 0',name='ck_invoice_payment_positive'),sa.ForeignKeyConstraint(['business_id'],['businesses.id'],ondelete='CASCADE'),sa.ForeignKeyConstraint(['invoice_id'],['invoices.id'],ondelete='RESTRICT'),sa.ForeignKeyConstraint(['recorded_by'],['users.id'],ondelete='RESTRICT'))
 op.create_index('ix_invoice_payments_business_id','invoice_payments',['business_id']);op.create_index('ix_invoice_payments_invoice_id','invoice_payments',['invoice_id'])
 op.add_column('receivables',sa.Column('invoice_id',sa.UUID(),nullable=True));op.create_unique_constraint('uq_receivable_invoice','receivables',['invoice_id']);op.create_foreign_key('fk_receivable_invoice','receivables','invoices',['invoice_id'],['id'],ondelete='RESTRICT')
def downgrade():
 op.drop_constraint('fk_receivable_invoice','receivables',type_='foreignkey');op.drop_constraint('uq_receivable_invoice','receivables',type_='unique');op.drop_column('receivables','invoice_id')
 op.drop_table('invoice_payments');op.drop_table('invoice_items');op.drop_table('invoices')
