"""Add penebusan and penebusan_item tables.

Revision ID: g2b3c4d5e6f7
Revises: f1a2b3c4d5e6
Create Date: 2026-04-02
"""

from alembic import op
import sqlalchemy as sa

revision = 'g2b3c4d5e6f7'
down_revision = 'f1a2b3c4d5e6'
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.create_table(
        'penebusan',
        sa.Column('id', sa.Integer(), nullable=False),
        sa.Column('spbu_id', sa.Integer(), nullable=False),
        sa.Column('tanggal', sa.Date(), nullable=False),
        sa.Column('booking_code', sa.String(length=50), nullable=False),
        sa.Column('no_so', sa.String(length=50), nullable=True),
        sa.Column('status', sa.String(length=30), nullable=False, server_default='draft'),
        sa.Column('subtotal', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('discount', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('ppn', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('pph22', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('pbbkb', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('rounding', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('debit_credit', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('total', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('pdf_do_url', sa.String(length=500), nullable=True),
        sa.Column('pdf_bukti_bayar_url', sa.String(length=500), nullable=True),
        sa.Column('created_by_id', sa.Integer(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.ForeignKeyConstraint(['spbu_id'], ['master_spbu.id'], ondelete='CASCADE'),
        sa.ForeignKeyConstraint(['created_by_id'], ['master_user.id'], ondelete='SET NULL'),
        sa.PrimaryKeyConstraint('id'),
        sa.UniqueConstraint('spbu_id', 'booking_code', name='uq_penebusan_spbu_booking'),
    )
    op.create_index('ix_penebusan_spbu_tanggal', 'penebusan', ['spbu_id', 'tanggal'])
    op.create_index('ix_penebusan_spbu_id', 'penebusan', ['spbu_id'])

    op.create_table(
        'penebusan_item',
        sa.Column('id', sa.Integer(), nullable=False),
        sa.Column('penebusan_id', sa.Integer(), nullable=False),
        sa.Column('produk_id', sa.Integer(), nullable=False),
        sa.Column('kode_item_pertamina', sa.String(length=50), nullable=True),
        sa.Column('volume_pesan', sa.Numeric(precision=15, scale=3), nullable=False),
        sa.Column('volume_diterima', sa.Numeric(precision=15, scale=3), nullable=False, server_default='0'),
        sa.Column('tanggal_kirim', sa.Date(), nullable=True),
        sa.Column('sent_to_text', sa.String(length=200), nullable=True),
        sa.ForeignKeyConstraint(['penebusan_id'], ['penebusan.id'], ondelete='CASCADE'),
        sa.ForeignKeyConstraint(['produk_id'], ['master_produk.id'], ondelete='RESTRICT'),
        sa.PrimaryKeyConstraint('id'),
    )
    op.create_index('ix_penebusan_item_penebusan_id', 'penebusan_item', ['penebusan_id'])


def downgrade() -> None:
    op.drop_index('ix_penebusan_item_penebusan_id', table_name='penebusan_item')
    op.drop_table('penebusan_item')
    op.drop_index('ix_penebusan_spbu_id', table_name='penebusan')
    op.drop_index('ix_penebusan_spbu_tanggal', table_name='penebusan')
    op.drop_table('penebusan')
