from datetime import datetime, timezone from app.extensions import db from app.models.charge import Charge from sqlalchemy.orm import relationship from sqlalchemy.sql import func 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) max_daily_loans = db.Column(db.Integer, nullable=True) max_active_loans = db.Column(db.Integer, nullable=True) max_life_loans = db.Column(db.Integer, nullable=True) created_at = db.Column(db.DateTime(timezone=True), server_default=func.now()) updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) 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 @classmethod def get_offer_by_id(cls, offer_id): """ Return an offer by its ID. """ offer = cls.query.filter_by(id=str(offer_id)).first() if not offer: raise ValueError(f"Offer with ID {offer_id} not found") return offer @classmethod def get_offer_by_product_id(cls, product_id): """ Return an offer by its product ID. """ offer = cls.query.filter_by(product_id=str(product_id)).first() if not offer: raise ValueError(f"Offer with Product ID {product_id} not found") 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, "maxDailyLoans": self.max_daily_loans, "maxActiveLoans": self.max_active_loans, "maxLifeLoans": self.max_life_loans } def __repr__(self): return f''