From d1b9d80c84ce8a0b87470a0ad3edb53fd75f275e Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Wed, 30 Apr 2025 05:56:38 -0400 Subject: [PATCH] Models added --- app/models/loan.py | 1 + app/models/loan_repayment_schedule.py | 1 + app/models/offer.py | 66 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 app/models/offer.py diff --git a/app/models/loan.py b/app/models/loan.py index 2c0c076..8a5852f 100644 --- a/app/models/loan.py +++ b/app/models/loan.py @@ -31,6 +31,7 @@ class Loan(db.Model): repayment_amount = db.Column(db.Float, nullable=True, default=0.0) installment_amount = db.Column(db.Float, nullable=True, default=0.0) status = db.Column(db.String(20), default='pending') + tenor = db.Column(db.Integer, nullable=True) due_date = db.Column(db.DateTime, nullable=True) created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) diff --git a/app/models/loan_repayment_schedule.py b/app/models/loan_repayment_schedule.py index 59802fb..337a5da 100644 --- a/app/models/loan_repayment_schedule.py +++ b/app/models/loan_repayment_schedule.py @@ -8,6 +8,7 @@ class LoanRepaymentSchedule(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) loan_id = db.Column(db.Integer, nullable=False) + transaction_id = db.Column(db.String(50), nullable=True) product_id = db.Column(db.String(20), nullable=True) installment_number = db.Column(db.Integer, nullable=False) due_date = db.Column(db.DateTime, nullable=False) diff --git a/app/models/offer.py b/app/models/offer.py new file mode 100644 index 0000000..b84f43e --- /dev/null +++ b/app/models/offer.py @@ -0,0 +1,66 @@ +from datetime import datetime, timezone +from app.extensions import db +from app.models.charge import Charge +from sqlalchemy.orm import relationship + +class Offer(db.Model): + __tablename__ = 'offers' + + id = db.Column(db.String, primary_key=True) + product_id = db.Column(db.String, nullable=False) + min_amount = db.Column(db.Float, nullable=False) + max_amount = db.Column(db.Float, nullable=False) + tenor = db.Column(db.Integer, nullable=False) + schedule = db.Column(db.Integer, nullable=True) + interest_rate = db.Column(db.Float, default=3.0) + management_rate = db.Column(db.Float, default=1.0) + insurance_rate = db.Column(db.Float, default=1.0) + vat_rate = db.Column(db.Float, default=7.5) + list_order = db.Column(db.Integer, nullable=True) + created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc)) + updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) + + charges = relationship( + "Charge", + primaryjoin="Offer.id == Charge.offer_id", + foreign_keys="Charge.offer_id", + back_populates="offer", + ) + + @classmethod + def get_all_offers(cls): + """ + Return all offers in dictionary format. + """ + offers = cls.query.all() + + if not offers: + raise ValueError(f"No available offers") + return offers + + @classmethod + def is_valid_offer(cls, offer_id): + offer = cls.query.filter_by(id=str(offer_id)).first() + + + if not offer: + return False + return offer + + + + def to_dict(self): + return { + "offerId": self.id, + "productId": self.product_id, + "minAmount": self.min_amount, + "maxAmount": self.max_amount, + "tenor": self.tenor, + "interest_rate": self.interest_rate, + "management_rate": self.management_rate, + "insurance_rate": self.insurance_rate, + "vat_rate": self.vat_rate + } + + def __repr__(self): + return f'' \ No newline at end of file