From ed7f568aee20c345b8babddc7196be7b916e6e35 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Tue, 24 Jun 2025 18:29:10 -0400 Subject: [PATCH] Added products --- app/api/services/products.py | 67 +++++++++----------------------- app/models/__init__.py | 8 +++- app/models/members_products.py | 52 +++++++++++++++++++++++++ app/models/products.py | 70 ++++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 52 deletions(-) create mode 100644 app/models/members_products.py create mode 100644 app/models/products.py diff --git a/app/api/services/products.py b/app/api/services/products.py index 01c116d..442569d 100644 --- a/app/api/services/products.py +++ b/app/api/services/products.py @@ -2,16 +2,17 @@ from flask import session, jsonify from app.models.loan import Loan from app.utils.logger import logger from app.api.services.base_service import BaseService -from app.api.schemas.eligibility_check import EligibilityCheckSchema +# from app.api.schemas.eligibility_check import EligibilityCheckSchema from marshmallow import ValidationError from app.api.enums import TransactionType from app.api.integrations import SimbrellaIntegration from app.extensions import db -from app.models import Offer, RACCheck, Members +from app.models import MembersProducts, Products, Members + from app.api.services.offer_analysis import OfferAnalysis from app.api.helpers.response_helper import ResponseHelper from werkzeug.security import generate_password_hash, check_password_hash -from app.api.schemas.register import RegisterSchema +# from app.api.schemas.register import RegisterSchema from app.api.schemas.products import ProductsSchema from app.api.schemas.user import UserSchema @@ -44,19 +45,20 @@ class ProductsService(BaseService): token = validated_data.get('token') uid = validated_data.get('uid') - user_id = 1 # current_user["user"]["id"] - PRODUCT_LIST = f"""SELECT p.id,p.uid,p.product_id,p.name,p.description,p.status,p.banner, - mp.status AS prov_status, - (CASE WHEN mp.status =6 THEN 'Preparing' WHEN mp.status=7 THEN 'Active' ELSE 'Activate Now' END) AS status_text - FROM products p - LEFT JOIN members_products mp ON mp.product_id = p.product_id - AND mp.member_id ={user_id} - ORDER BY p.id ASC""" + member_id = 1 # current_user["user"]["id"] + # PRODUCT_LIST = f"""SELECT p.id,p.uid,p.product_id,p.name,p.description,p.status,p.banner, + # mp.status AS prov_status, + # (CASE WHEN mp.status =6 THEN 'Preparing' WHEN mp.status=7 THEN 'Active' ELSE 'Activate Now' END) AS status_text + # FROM products p + # LEFT JOIN members_products mp ON mp.product_id = p.product_id + # AND mp.member_id ={user_id} + # ORDER BY p.id ASC""" + # + # logger.error(f"Product list query (PRODUCT_LIST: {PRODUCT_LIST})") + # + # data = db.session.execute(PRODUCT_LIST) + data = Products.get_user_product_list(member_id) - logger.error(f"Product list query (PRODUCT_LIST: {PRODUCT_LIST})") - - data = db.session.execute(PRODUCT_LIST) - # Simulate processing response_data = { "data": data.fetchall(), @@ -82,38 +84,3 @@ class ProductsService(BaseService): db.session.rollback() return ResponseHelper.internal_server_error() - @staticmethod - def check_loan_limits(customer_id): - """ - Checks if a customer has exceeded the loan limits for given offer. - """ - loan = Loan.get_customer_last_loan(customer_id) - - if not loan: - return True - - offer_id = loan.offer_id[:5] - - offer = Offer.get_offer_by_id(offer_id) - if not offer: - logger.error(f"Offer not found for offer_id: {offer_id} (customer_id: {customer_id})") - return False - - daily_count = Loan.get_daily_loan_count(customer_id, offer.product_id) - - logger.info(f"daily_count: {daily_count}, Max: {offer.max_daily_loans}") - - if offer.max_daily_loans is not None and daily_count >= offer.max_daily_loans: - return False - - return True - - - - -# { -# "email": "ameye@chiefsoft.com", -# "firstname": "Olusesan", -# "lastname": "Ameye", -# "isChecked": true -# } \ No newline at end of file diff --git a/app/models/__init__.py b/app/models/__init__.py index 3d980b1..e2bf156 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -12,7 +12,11 @@ from .transaction_offers import TransactionOffer from .repayments_data import RepaymentsData from .salary import Salary from .members import Members +from .products import Products +from .members_products import MembersProducts - -__all__ = ['Members','Customer', 'Account', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData', 'Salary'] \ No newline at end of file +__all__ = ['Members','Customer', 'Account', 'Products', + 'MembersProducts', 'Loan', 'Transaction', 'Repayment', + 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', + 'TransactionOffer', 'RepaymentsData', 'Salary'] \ No newline at end of file diff --git a/app/models/members_products.py b/app/models/members_products.py new file mode 100644 index 0000000..c58aacc --- /dev/null +++ b/app/models/members_products.py @@ -0,0 +1,52 @@ +from datetime import datetime, timezone, timedelta +from itertools import product +from app.extensions import db +from app.models.customer import Customer +from app.models.account import Account +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import relationship +from dateutil.relativedelta import relativedelta +from datetime import timedelta +import logging +from sqlalchemy import and_, or_, not_ +from sqlalchemy.sql import func + +logger = logging.getLogger(__name__) + +class MembersProducts(db.Model): + __tablename__ = 'members_products' + + id = db.Column( + db.Integer, + primary_key=True, + autoincrement=True, + ) + + uid = db.Column(db.String(150), nullable=True) + member_id = db.Column(db.Integer, nullable=False) + product_id = db.Column(db.String(25), nullable=False) + internal_url = db.Column(db.String(100), nullable=False) + external_url = db.Column(db.String(100), nullable=False) + dns_group = db.Column(db.String(20), nullable=False) + status = db.Column(db.Integer, nullable=True, default=0) + added = db.Column(db.DateTime(timezone=True), server_default=func.now()) + updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + + def to_dict(self): + """ + Convert the Loan object to a dictionary format for JSON serialization. + """ + return { + 'id': self.id, + 'uid': self.uid, + 'product_id': self.product_id, + 'internal_url': self.internal_url, + 'external_url': self.external_url, + 'dns_group': self.dns_group, + 'status': self.status, + 'added': self.added, + 'updated': self.updated + } + + def __repr__(self): + return f'' diff --git a/app/models/products.py b/app/models/products.py new file mode 100644 index 0000000..1f56e55 --- /dev/null +++ b/app/models/products.py @@ -0,0 +1,70 @@ +from datetime import datetime, timezone, timedelta +from itertools import product +from app.extensions import db +from app.models.customer import Customer +from app.models.account import Account +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import relationship +from dateutil.relativedelta import relativedelta +from datetime import timedelta +import logging +from sqlalchemy import and_, or_, not_ +from sqlalchemy.sql import func + +logger = logging.getLogger(__name__) + +class Products(db.Model): + __tablename__ = 'products' + + id = db.Column( + db.Integer, + primary_key=True, + autoincrement=True, + ) + + uid = db.Column(db.String(150), nullable=True) + product_id = db.Column(db.String(25), nullable=False) + name = db.Column(db.String(100), nullable=False) + description = db.Column(db.String(250), nullable=False) + status = db.Column(db.Integer, nullable=True, default=0) + added = db.Column(db.DateTime(timezone=True), server_default=func.now()) + updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + banner = db.Column(db.String(100), nullable=True) + + + members_products = relationship( + "MembersProducts", + primaryjoin="MembersProducts.product_id == Products.product_id", + foreign_keys="MembersProducts.member_id", + back_populates="Products", + ) + + @classmethod + def get_user_product_list(cls, member_id): + + product_list = cls.query.filter_by( + member_id=member_id, + # status='active' + ).all() + + return product_list + + + def to_dict(self): + """ + Convert the Loan object to a dictionary format for JSON serialization. + """ + return { + 'id': self.id, + 'uid': self.uid, + 'product_id': self.product_id, + 'productId': self.product_id, + 'name': self.name, + 'status': self.status, + 'added': self.added, + 'updated': self.updated, + 'banner': self.banner + } + + def __repr__(self): + return f''