281 lines
14 KiB
Python
281 lines
14 KiB
Python
"""empty message
|
|
|
|
Revision ID: 33e09efd85e3
|
|
Revises:
|
|
Create Date: 2025-07-03 14:07:14.424548
|
|
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy import literal_column
|
|
from sqlalchemy import text
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = '33e09efd85e3'
|
|
down_revision = None
|
|
branch_labels = None
|
|
depends_on = None
|
|
sequences_and_triggers = [
|
|
("transactions", "transactions_seq", "trg_transactions_id"),
|
|
("transaction_offers", "transaction_offers_seq", "trg_transaction_offers_id"),
|
|
("salaries", "salaries_seq", "trg_salaries_id"),
|
|
("repayments_data", "repayments_data_seq", "trg_repayments_data_id"),
|
|
("repayments", "repayments_seq", "trg_repayments_id"),
|
|
("rac_checks", "rac_checks_seq", "trg_rac_checks_id"),
|
|
("loans", "loans_seq", "trg_loans_id"),
|
|
(
|
|
"loan_repayment_schedules",
|
|
"loan_repayment_schedules_seq",
|
|
"trg_loan_repayment_schedules_id",
|
|
),
|
|
("loan_charges", "loan_charges_seq", "trg_loan_charges_id"),
|
|
("charges", "charges_seq", "trg_charges_id"),
|
|
]
|
|
|
|
|
|
def upgrade():
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
op.create_table('accounts',
|
|
sa.Column('id', sa.String(length=50), nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('account_type', sa.String(length=50), nullable=True),
|
|
sa.Column('status', sa.String(length=20), nullable=True),
|
|
sa.Column('lien_amount', sa.Float(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('charges',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('offer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('code', sa.String(length=50), nullable=False),
|
|
sa.Column('percent', sa.Float(), nullable=True),
|
|
sa.Column('description', sa.Text(), nullable=True),
|
|
sa.Column('due', sa.Integer(), nullable=False),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('customers',
|
|
sa.Column('id', sa.String(length=50), nullable=False),
|
|
sa.Column('msisdn', sa.String(length=20), nullable=False),
|
|
sa.Column('country_code', sa.String(length=3), nullable=False),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id'),
|
|
sa.UniqueConstraint('msisdn')
|
|
)
|
|
op.create_table('loan_charges',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('loan_id', sa.Integer(), nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=True),
|
|
sa.Column('code', sa.String(length=50), nullable=False),
|
|
sa.Column('amount', sa.Float(), nullable=True),
|
|
sa.Column('percent', sa.Float(), nullable=True),
|
|
sa.Column('description', sa.Text(), nullable=True),
|
|
sa.Column('due', sa.Integer(), nullable=False),
|
|
sa.Column('due_date', sa.DateTime(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('loan_repayment_schedules',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('loan_id', sa.Integer(), nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=True),
|
|
sa.Column('product_id', sa.String(length=20), nullable=True),
|
|
sa.Column('installment_number', sa.Integer(), nullable=False),
|
|
sa.Column('due_date', sa.DateTime(), nullable=False),
|
|
sa.Column('installment_amount', sa.Float(), nullable=True),
|
|
sa.Column('total_repayment_amount', sa.Float(), nullable=True),
|
|
sa.Column('paid', sa.Boolean(), nullable=True),
|
|
sa.Column('paid_at', sa.DateTime(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('loans',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=True),
|
|
sa.Column('original_transaction', sa.String(length=50), nullable=True),
|
|
sa.Column('account_id', sa.String(length=50), nullable=False),
|
|
sa.Column('offer_id', sa.String(length=20), nullable=False),
|
|
sa.Column('product_id', sa.String(length=20), nullable=True),
|
|
sa.Column('collection_type', sa.String(length=20), nullable=True),
|
|
sa.Column('current_loan_amount', sa.Float(), nullable=True),
|
|
sa.Column('initial_loan_amount', sa.Float(), nullable=False),
|
|
sa.Column('default_penalty_fee', sa.Float(), nullable=True),
|
|
sa.Column('continuous_fee', sa.Float(), nullable=True),
|
|
sa.Column('upfront_fee', sa.Float(), nullable=True),
|
|
sa.Column('repayment_amount', sa.Float(), nullable=True),
|
|
sa.Column('installment_amount', sa.Float(), nullable=True),
|
|
sa.Column('status', sa.String(length=20), nullable=True),
|
|
sa.Column('tenor', sa.Integer(), nullable=True),
|
|
sa.Column('due_date', sa.DateTime(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('eligible_amount', sa.Float(), nullable=True),
|
|
sa.Column('disburse_date', sa.DateTime(), nullable=True),
|
|
sa.Column('disburse_verify', sa.DateTime(), nullable=True),
|
|
sa.Column('reference', sa.String(length=50), nullable=True),
|
|
sa.Column('disburse_result', sa.String(length=10), nullable=True),
|
|
sa.Column('disburse_description', sa.String(length=100), nullable=True),
|
|
sa.Column('verify_result', sa.String(length=10), nullable=True),
|
|
sa.Column('verify_description', sa.String(length=100), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('offers',
|
|
sa.Column('id', sa.String(length=50), nullable=False),
|
|
sa.Column('product_id', sa.String(length=50), nullable=False),
|
|
sa.Column('min_amount', sa.Float(), nullable=False),
|
|
sa.Column('max_amount', sa.Float(), nullable=False),
|
|
sa.Column('tenor', sa.Integer(), nullable=False),
|
|
sa.Column('schedule', sa.Integer(), nullable=True),
|
|
sa.Column('interest_rate', sa.Float(), nullable=True),
|
|
sa.Column('management_rate', sa.Float(), nullable=True),
|
|
sa.Column('insurance_rate', sa.Float(), nullable=True),
|
|
sa.Column('vat_rate', sa.Float(), nullable=True),
|
|
sa.Column('list_order', sa.Integer(), nullable=True),
|
|
sa.Column('max_daily_loans', sa.Integer(), nullable=True),
|
|
sa.Column('max_active_loans', sa.Integer(), nullable=True),
|
|
sa.Column('max_life_loans', sa.Integer(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('rac_checks',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('account_id', sa.String(length=50), nullable=False),
|
|
sa.Column('rac_response', sa.Text(), nullable=False),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('repayments',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('loan_id', sa.String(length=50), nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('product_id', sa.String(length=20), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=True),
|
|
sa.Column('repay_date', sa.DateTime(), nullable=True),
|
|
sa.Column('repay_result', sa.String(length=10), nullable=True),
|
|
sa.Column('repay_description', sa.String(length=100), nullable=True),
|
|
sa.Column('verify_date', sa.DateTime(), nullable=True),
|
|
sa.Column('verify_result', sa.String(length=10), nullable=True),
|
|
sa.Column('verify_description', sa.String(length=100), nullable=True),
|
|
sa.Column('initiated_by', sa.String(length=50), nullable=True),
|
|
sa.Column('salary_amount', sa.Float(), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('repayments_data',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=False),
|
|
sa.Column('fbn_transaction_id', sa.String(length=50), nullable=True),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=True),
|
|
sa.Column('account_id', sa.String(length=50), nullable=True),
|
|
sa.Column('repayment_amount', sa.Float(), nullable=True),
|
|
sa.Column('amount_collected', sa.Float(), nullable=True),
|
|
sa.Column('added_date', sa.DateTime(timezone=True), nullable=False),
|
|
sa.Column('response_code', sa.String(length=10), nullable=True),
|
|
sa.Column('response_descr', sa.String(length=255), nullable=True),
|
|
sa.Column('balance', sa.Float(), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('salaries',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('account_id', sa.String(length=50), nullable=True),
|
|
sa.Column('status', sa.String(length=20), nullable=True),
|
|
sa.Column('amount', sa.Float(), nullable=False),
|
|
sa.Column('salary_date', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('transaction_offers',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=False),
|
|
sa.Column('original_transaction', sa.String(length=50), nullable=True),
|
|
sa.Column('offer_id', sa.String(length=20), nullable=False),
|
|
sa.Column('product_id', sa.String(length=20), nullable=True),
|
|
sa.Column('min_amount', sa.Float(), nullable=False),
|
|
sa.Column('max_amount', sa.Float(), nullable=False),
|
|
sa.Column('eligible_amount', sa.Float(), nullable=True),
|
|
sa.Column('tenor', sa.Integer(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_table('transactions',
|
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column('transaction_id', sa.String(length=50), nullable=False),
|
|
sa.Column('account_id', sa.String(length=50), nullable=True),
|
|
sa.Column('customer_id', sa.String(length=50), nullable=True),
|
|
sa.Column('type', sa.String(length=50), nullable=False),
|
|
sa.Column('channel', sa.String(length=50), nullable=False),
|
|
sa.Column('phone_number', sa.String(length=50), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
|
|
for table, seq, trg in sequences_and_triggers:
|
|
op.execute(
|
|
text(
|
|
f"""
|
|
BEGIN
|
|
EXECUTE IMMEDIATE 'CREATE SEQUENCE {seq} START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
IF SQLCODE != -955 THEN RAISE; END IF;
|
|
END;
|
|
"""
|
|
)
|
|
)
|
|
|
|
op.execute(
|
|
text(
|
|
f"""
|
|
CREATE OR REPLACE TRIGGER {trg}
|
|
BEFORE INSERT ON {table}
|
|
FOR EACH ROW
|
|
BEGIN
|
|
IF ||':'||'NEW.id IS NULL THEN
|
|
SELECT {seq}.NEXTVAL INTO '||':'||'NEW.id FROM dual;
|
|
END IF;
|
|
END;
|
|
"""
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
def downgrade():
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
op.drop_table('transactions')
|
|
op.drop_table('transaction_offers')
|
|
op.drop_table('salaries')
|
|
op.drop_table('repayments_data')
|
|
op.drop_table('repayments')
|
|
op.drop_table('rac_checks')
|
|
op.drop_table('offers')
|
|
op.drop_table('loans')
|
|
op.drop_table('loan_repayment_schedules')
|
|
op.drop_table('loan_charges')
|
|
op.drop_table('customers')
|
|
op.drop_table('charges')
|
|
op.drop_table('accounts')
|
|
# ### end Alembic commands ###
|
|
|
|
for table, seq, trg in sequences_and_triggers:
|
|
op.execute(text(f"DROP TRIGGER {trg}"))
|
|
op.execute(text(f"DROP SEQUENCE {seq}"))
|