diff --git a/app/api/services/offer_analysis.py b/app/api/services/offer_analysis.py index cfbbb42..279de6f 100644 --- a/app/api/services/offer_analysis.py +++ b/app/api/services/offer_analysis.py @@ -93,7 +93,7 @@ class OfferAnalysis: - logger.info(f"These are the salarie amounts ***** : {str(salaries)}", exc_info=True) + logger.info(f"These are the salary amounts ***** : {str(salaries)}", exc_info=True) #Least salary in the last 6 months min_salary = min(salaries) @@ -113,7 +113,7 @@ class OfferAnalysis: else: # Income is not consistent eligible_amount = 0 - logger.info("Applying np percentage on least salary due unstable income.") + logger.info("Applying no percentage on least salary due unstable income.") diff --git a/app/models/__init__.py b/app/models/__init__.py index 14e5a38..6331244 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -10,6 +10,7 @@ from .rac_checks import RACCheck from .loan_repayment_schedule import LoanRepaymentSchedule from .transaction_offers import TransactionOffer from .repayments_data import RepaymentsData +from .salary import Salary -__all__ = ['Customer', 'Account', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData'] \ No newline at end of file +__all__ = ['Customer', 'Account', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData', 'Salary'] \ No newline at end of file diff --git a/app/models/repayment.py b/app/models/repayment.py index 1116e0a..f9d6e44 100644 --- a/app/models/repayment.py +++ b/app/models/repayment.py @@ -27,6 +27,8 @@ class Repayment(db.Model): verify_date = db.Column(db.DateTime, default=datetime.now(timezone.utc)) verify_result = db.Column(db.String(10), nullable=True) verify_description = db.Column(db.String(100), nullable=True) + initiated_by = db.Column(db.String(50), nullable=True) + salary_amount = db.Column(db.Float, nullable=True, default=0.0) @classmethod def create_repayment(cls, customer_id, loan, transaction_id): @@ -51,6 +53,25 @@ class Repayment(db.Model): raise ValueError(f"Database integrity error: {err}") return repayment + + def to_dict(self): + return { + "id": self.id, + "loan_id": self.loan_id, + "customer_id": self.customer_id, + "product_id": self.product_id, + "created_at": self.created_at.isoformat() if self.created_at else None, + "updated_at": self.updated_at.isoformat() if self.updated_at else None, + "transaction_id": self.transaction_id, + "repay_date": self.repay_date.isoformat() if self.repay_date else None, + "repay_result": self.repay_result, + "repay_description": self.repay_description, + "verify_date": self.verify_date.isoformat() if self.verify_date else None, + "verify_result": self.verify_result, + "verify_description": self.verify_description, + "initiated_by": self.initiated_by, + "salary_amount": self.salary_amount + } def __repr__(self): return f'' diff --git a/app/models/repayments_data.py b/app/models/repayments_data.py index 94abf37..2e58551 100644 --- a/app/models/repayments_data.py +++ b/app/models/repayments_data.py @@ -15,6 +15,7 @@ class RepaymentsData(db.Model): added_date = db.Column(db.DateTime(timezone=True), default=datetime.now(timezone.utc), nullable=False) response_code = db.Column(db.String(10), nullable=True) response_descr = db.Column(db.String(255), nullable=True) + balance = db.Column(db.Float, nullable=True, default=0.0) def to_dict(self): return { @@ -28,6 +29,7 @@ class RepaymentsData(db.Model): "added_date": self.added_date.isoformat() if self.added_date else None, "response_code": self.response_code, "response_descr": self.response_descr, + "balance": self.balance, } def __repr__(self): diff --git a/app/models/salary.py b/app/models/salary.py new file mode 100644 index 0000000..19b67cd --- /dev/null +++ b/app/models/salary.py @@ -0,0 +1,31 @@ +from datetime import datetime, timezone +from app.extensions import db +from sqlalchemy.sql import func + +class Salary(db.Model): + __tablename__ = 'salaries' + + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + customer_id = db.Column(db.String(50), nullable=False) + account_type = db.Column(db.String(50)) + status = db.Column(db.String(20), default='active') + amount = db.Column(db.Float, nullable=False, default=0.0) + salary_date = db.Column(db.DateTime(timezone=False), server_default=func.now()) + created_at = db.Column(db.DateTime(timezone=False), server_default=func.now()) + updated_at = db.Column(db.DateTime(timezone=False), server_default=func.now(), onupdate=func.now()) + + def to_dict(self): + return { + "id": self.id, + "customer_id": self.customer_id, + "account_type": self.account_type, + "status": self.status, + "amount": self.amount, + "salary_date": self.salary_date.isoformat() if self.salary_date else None, + "created_at": self.created_at.isoformat() if self.created_at else None, + "updated_at": self.updated_at.isoformat() if self.updated_at else None + } + + def __repr__(self): + return f'' + \ No newline at end of file diff --git a/migrations/versions/1696ee63c28a_.py b/migrations/versions/1696ee63c28a_.py new file mode 100644 index 0000000..ddbe1fa --- /dev/null +++ b/migrations/versions/1696ee63c28a_.py @@ -0,0 +1,52 @@ +"""empty message + +Revision ID: 1696ee63c28a +Revises: b54422fb31e0 +Create Date: 2025-06-18 12:28:23.942143 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1696ee63c28a' +down_revision = 'b54422fb31e0' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + 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_type', 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('now()'), nullable=True), + sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=True), + sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + with op.batch_alter_table('repayments', schema=None) as batch_op: + batch_op.add_column(sa.Column('initiated_by', sa.String(length=50), nullable=True)) + batch_op.add_column(sa.Column('salary_amount', sa.Float(), nullable=True)) + + with op.batch_alter_table('repayments_data', schema=None) as batch_op: + batch_op.add_column(sa.Column('balance', sa.Float(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('repayments_data', schema=None) as batch_op: + batch_op.drop_column('balance') + + with op.batch_alter_table('repayments', schema=None) as batch_op: + batch_op.drop_column('salary_amount') + batch_op.drop_column('initiated_by') + + op.drop_table('salaries') + # ### end Alembic commands ###