Added products

This commit is contained in:
CHIEFSOFT\ameye
2025-06-24 18:29:10 -04:00
parent b53002168e
commit ed7f568aee
4 changed files with 145 additions and 52 deletions
+17 -50
View File
@@ -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
# }
+6 -2
View File
@@ -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']
__all__ = ['Members','Customer', 'Account', 'Products',
'MembersProducts', 'Loan', 'Transaction', 'Repayment',
'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule',
'TransactionOffer', 'RepaymentsData', 'Salary']
+52
View File
@@ -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'<MembersProducts {self.id}>'
+70
View File
@@ -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'<Products {self.id}>'