Added products
This commit is contained in:
@@ -2,16 +2,17 @@ from flask import session, jsonify
|
|||||||
from app.models.loan import Loan
|
from app.models.loan import Loan
|
||||||
from app.utils.logger import logger
|
from app.utils.logger import logger
|
||||||
from app.api.services.base_service import BaseService
|
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 marshmallow import ValidationError
|
||||||
from app.api.enums import TransactionType
|
from app.api.enums import TransactionType
|
||||||
from app.api.integrations import SimbrellaIntegration
|
from app.api.integrations import SimbrellaIntegration
|
||||||
from app.extensions import db
|
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.services.offer_analysis import OfferAnalysis
|
||||||
from app.api.helpers.response_helper import ResponseHelper
|
from app.api.helpers.response_helper import ResponseHelper
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
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.products import ProductsSchema
|
||||||
from app.api.schemas.user import UserSchema
|
from app.api.schemas.user import UserSchema
|
||||||
|
|
||||||
@@ -44,18 +45,19 @@ class ProductsService(BaseService):
|
|||||||
token = validated_data.get('token')
|
token = validated_data.get('token')
|
||||||
uid = validated_data.get('uid')
|
uid = validated_data.get('uid')
|
||||||
|
|
||||||
user_id = 1 # current_user["user"]["id"]
|
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,
|
# PRODUCT_LIST = f"""SELECT p.id,p.uid,p.product_id,p.name,p.description,p.status,p.banner,
|
||||||
mp.status AS prov_status,
|
# 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
|
# (CASE WHEN mp.status =6 THEN 'Preparing' WHEN mp.status=7 THEN 'Active' ELSE 'Activate Now' END) AS status_text
|
||||||
FROM products p
|
# FROM products p
|
||||||
LEFT JOIN members_products mp ON mp.product_id = p.product_id
|
# LEFT JOIN members_products mp ON mp.product_id = p.product_id
|
||||||
AND mp.member_id ={user_id}
|
# AND mp.member_id ={user_id}
|
||||||
ORDER BY p.id ASC"""
|
# ORDER BY p.id ASC"""
|
||||||
|
#
|
||||||
logger.error(f"Product list query (PRODUCT_LIST: {PRODUCT_LIST})")
|
# logger.error(f"Product list query (PRODUCT_LIST: {PRODUCT_LIST})")
|
||||||
|
#
|
||||||
data = db.session.execute(PRODUCT_LIST)
|
# data = db.session.execute(PRODUCT_LIST)
|
||||||
|
data = Products.get_user_product_list(member_id)
|
||||||
|
|
||||||
# Simulate processing
|
# Simulate processing
|
||||||
response_data = {
|
response_data = {
|
||||||
@@ -82,38 +84,3 @@ class ProductsService(BaseService):
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return ResponseHelper.internal_server_error()
|
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
|
|
||||||
# }
|
|
||||||
@@ -12,7 +12,11 @@ from .transaction_offers import TransactionOffer
|
|||||||
from .repayments_data import RepaymentsData
|
from .repayments_data import RepaymentsData
|
||||||
from .salary import Salary
|
from .salary import Salary
|
||||||
from .members import Members
|
from .members import Members
|
||||||
|
from .products import Products
|
||||||
|
from .members_products import MembersProducts
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['Members','Customer', 'Account', 'Products',
|
||||||
__all__ = ['Members','Customer', 'Account', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData', 'Salary']
|
'MembersProducts', 'Loan', 'Transaction', 'Repayment',
|
||||||
|
'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule',
|
||||||
|
'TransactionOffer', 'RepaymentsData', 'Salary']
|
||||||
@@ -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}>'
|
||||||
@@ -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}>'
|
||||||
Reference in New Issue
Block a user