general cleanup
This commit is contained in:
@@ -228,6 +228,66 @@ merms_panel=# select product_id,description from products;
|
|||||||
A000005 | Get Open EMR for practice management
|
A000005 | Get Open EMR for practice management
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
|
CREATE TABLE products_templates (
|
||||||
|
id SERIAL,
|
||||||
|
uid uuid DEFAULT uuid_generate_v4(),
|
||||||
|
product_id VARCHAR(25) REFERENCES products(product_id),
|
||||||
|
name VARCHAR(55) UNIQUE NOT NULL,
|
||||||
|
status INT DEFAULT 0,
|
||||||
|
owner_uid VARCHAR(100),
|
||||||
|
provision_name VARCHAR(250),
|
||||||
|
added timestamp without time zone DEFAULT now()
|
||||||
|
);
|
||||||
|
ALTER TABLE ONLY products_templates
|
||||||
|
ADD CONSTRAINT products_templates_id_key UNIQUE (id);
|
||||||
|
|
||||||
|
ALTER TABLE products_templates OWNER TO merms_panel;
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000001',
|
||||||
|
'Template A01',
|
||||||
|
'registry.chiefsoft.com/pweb/pweb-01-merms-pweb0004:latest',
|
||||||
|
1);
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000001',
|
||||||
|
'Template A02',
|
||||||
|
'registry.chiefsoft.com/pweb/pweb-01-merms-pweb0005:latest',
|
||||||
|
1);
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000001',
|
||||||
|
'Template A03',
|
||||||
|
'registry.chiefsoft.com/pweb/pweb-01-merms-pweb0006:latest',
|
||||||
|
1);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000002',
|
||||||
|
'Practice B01',
|
||||||
|
'registry.chiefsoft.com/pweb/pweb-01-merms-pweb0007:latest',
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000002',
|
||||||
|
'Practice B02',
|
||||||
|
'registry.chiefsoft.com/pweb/pweb-01-merms-pweb0008:latest',
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO products_templates(product_id,name,provision_name,status)
|
||||||
|
VALUES(
|
||||||
|
'A000002',
|
||||||
|
'',
|
||||||
|
''
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE members_products (
|
CREATE TABLE members_products (
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
from app.api.services.eligibility_check import EligibilityCheckService
|
# from app.api.services.eligibility_check import EligibilityCheckService
|
||||||
from app.api.services.select_offer import SelectOfferService
|
# from app.api.services.select_offer import SelectOfferService
|
||||||
from app.api.services.provide_loan import ProvideLoanService
|
# from app.api.services.provide_loan import ProvideLoanService
|
||||||
from app.api.services.loan_status import LoanStatusService
|
# from app.api.services.loan_status import LoanStatusService
|
||||||
from app.api.services.repayment import RepaymentService
|
# from app.api.services.repayment import RepaymentService
|
||||||
from app.api.services.customer_consent import CustomerConsentService
|
# from app.api.services.customer_consent import CustomerConsentService
|
||||||
from app.api.services.notification_callback import NotificationCallbackService
|
# from app.api.services.notification_callback import NotificationCallbackService
|
||||||
from app.api.services.authorization import AuthorizationService
|
from app.api.services.authorization import AuthorizationService
|
||||||
from app.api.services.offer_analysis import OfferAnalysis
|
# from app.api.services.offer_analysis import OfferAnalysis
|
||||||
from app.api.services.login import LoginService
|
from app.api.services.login import LoginService
|
||||||
from app.api.services.register import RegisterService
|
from app.api.services.register import RegisterService
|
||||||
from app.api.services.products import ProductsService
|
from app.api.services.products import ProductsService
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ 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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from app.models import Customer, Account, Transaction
|
# from app.models import Customer, Account, Transaction
|
||||||
from app.api.enums import TransactionType
|
from app.api.enums import TransactionType
|
||||||
from flask import jsonify
|
from flask import jsonify
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from marshmallow import ValidationError
|
|||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.models import MembersProducts, Products, 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
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
from flask import request, jsonify
|
from flask import request, jsonify
|
||||||
from app.api.helpers.response_helper import ResponseHelper
|
from app.api.helpers.response_helper import ResponseHelper
|
||||||
from app.api.services.base_service import BaseService
|
# from app.api.services.base_service import BaseService
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
from app.utils.logger import logger
|
from app.utils.logger import logger
|
||||||
from app.api.schemas.customer_consent import CustomerConsentSchema
|
# from app.api.schemas.customer_consent import CustomerConsentSchema
|
||||||
from app.api.services.base_service import BaseService
|
from app.api.services.base_service import BaseService
|
||||||
from app.api.enums import TransactionType
|
from app.api.enums import TransactionType
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ from app.utils.logger import logger
|
|||||||
from app.api.services.base_service import BaseService
|
from app.api.services.base_service import BaseService
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.models import MembersProducts, Products, Members, ProductsDetails, ProductsDetails, ProvisionActions, MembersProductsSettings
|
from app.models import MembersProducts, Products, Members, ProductsDetails, ProductsDetails, ProvisionActions, \
|
||||||
|
MembersProductsSettings, ProductsTemplates
|
||||||
from app.api.helpers.response_helper import ResponseHelper
|
from app.api.helpers.response_helper import ResponseHelper
|
||||||
from app.api.schemas.myproduct import MyProductSchema
|
from app.api.schemas.myproduct import MyProductSchema
|
||||||
from app.api.schemas.provision import ProvisionSchema
|
from app.api.schemas.provision import ProvisionSchema
|
||||||
@@ -15,6 +16,7 @@ import jwt
|
|||||||
import random
|
import random
|
||||||
from app.config import Config
|
from app.config import Config
|
||||||
|
|
||||||
|
|
||||||
class MyProductsService(BaseService):
|
class MyProductsService(BaseService):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -22,28 +24,75 @@ class MyProductsService(BaseService):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def mpproduct_template_data():
|
def mpproduct_template_data(data):
|
||||||
# class MyProductSchema(Schema):
|
try:
|
||||||
# token = fields.Str(required=True)
|
with db.session.begin():
|
||||||
# uid = fields.Str(required=True)
|
logger.info(f"Incoming MyProduct data ==>>>> {data}")
|
||||||
# product_id = fields.Str(required=True)
|
validated_data = MyProductsService.validate_data(data, MyProductSchema())
|
||||||
|
token = validated_data.get('token')
|
||||||
|
uid = validated_data.get('uid')
|
||||||
|
member_data = Members.get_member_by_uid(uid)
|
||||||
|
member_id = member_data.id
|
||||||
|
|
||||||
template_data = {
|
product_id = validated_data.get('product_id')
|
||||||
'template_16' : { 'title': 'Template Name-16', 'template_id': '02af24fd-2b1a-46ed-af21-87018e726408', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_22' : { 'title': 'Template Name-22', 'template_id': '8b296894-42e4-4f2e-abd1-7c2a38d6e07b', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_47' : { 'title': 'Template Name-47', 'template_id': 'ef2ffa1c-9272-42cd-9d33-0e614047b4f8', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_25' : { 'title': 'Template Name-25', 'template_id': 'b3a7ba31-dc47-4a40-a5cc-fd1ff27d6b78', 'banner': 'file-icon/svg.png', 'active': '1' },
|
|
||||||
'template_49' : { 'title': 'Template Name-49', 'template_id': '60959c69-6672-4f69-a006-eeb7d210e605', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_27' : { 'title': 'Template Name-27', 'template_id': 'e4acb98a-c584-45f2-bece-af677dcf0a1f', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_51' : { 'title': 'Template Name-51', 'template_id': '975ee42e-3169-4978-92d7-d28e7e2ac014', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
'template_9' : { 'title': 'Template Name-9', 'template_id': 'fc8f0738-6500-4775-9895-2047cd275302', 'banner': 'file-icon/svg.png', 'active': '0' },
|
|
||||||
}
|
|
||||||
|
|
||||||
response_data = {
|
# class MyProductSchema(Schema):
|
||||||
"templates": template_data,
|
# token = fields.Str(required=True)
|
||||||
"last_update": datetime.datetime.utcnow(),
|
# uid = fields.Str(required=True)
|
||||||
}
|
# product_id = fields.Str(required=True)
|
||||||
return ResponseHelper.success(data=response_data)
|
templates = ProductsTemplates.get_template_by_product_id(product_id)
|
||||||
|
template_data = {
|
||||||
|
'template_16': {'title': 'Template Name-16', 'template_id': '02af24fd-2b1a-46ed-af21-87018e726408',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_22': {'title': 'Template Name-22', 'template_id': '8b296894-42e4-4f2e-abd1-7c2a38d6e07b',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_47': {'title': 'Template Name-47', 'template_id': 'ef2ffa1c-9272-42cd-9d33-0e614047b4f8',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_25': {'title': 'Template Name-25', 'template_id': 'b3a7ba31-dc47-4a40-a5cc-fd1ff27d6b78',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '1'},
|
||||||
|
'template_49': {'title': 'Template Name-49', 'template_id': '60959c69-6672-4f69-a006-eeb7d210e605',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_27': {'title': 'Template Name-27', 'template_id': 'e4acb98a-c584-45f2-bece-af677dcf0a1f',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_51': {'title': 'Template Name-51', 'template_id': '975ee42e-3169-4978-92d7-d28e7e2ac014',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
'template_9': {'title': 'Template Name-9', 'template_id': 'fc8f0738-6500-4775-9895-2047cd275302',
|
||||||
|
'banner': 'file-icon/svg.png', 'active': '0'},
|
||||||
|
}
|
||||||
|
template_data =[]
|
||||||
|
for t in templates:
|
||||||
|
template_data.append({
|
||||||
|
'id': t.id,
|
||||||
|
'template_uid': t.uid,
|
||||||
|
'title': t.name,
|
||||||
|
'active': 1,
|
||||||
|
'added': t.added.isoformat() if t.added else None
|
||||||
|
})
|
||||||
|
|
||||||
|
response_data = {
|
||||||
|
"product_id": product_id,
|
||||||
|
"templates": template_data,
|
||||||
|
"last_update": datetime.datetime.utcnow(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseHelper.success(data=response_data)
|
||||||
|
|
||||||
|
|
||||||
|
except ValidationError as err:
|
||||||
|
|
||||||
|
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
|
||||||
|
db.session.rollback()
|
||||||
|
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
|
||||||
|
|
||||||
|
except ValueError as err:
|
||||||
|
logger.error(f"{getattr(err, 'messages', str(err))}")
|
||||||
|
db.session.rollback()
|
||||||
|
return ResponseHelper.error(result_description=str(err))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
||||||
|
db.session.rollback()
|
||||||
|
return ResponseHelper.internal_server_error()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def process_provision(data):
|
def process_provision(data):
|
||||||
@@ -67,16 +116,16 @@ class MyProductsService(BaseService):
|
|||||||
}, 400
|
}, 400
|
||||||
|
|
||||||
logger.info(f"GET HERE ******************************** : {data}", exc_info=True)
|
logger.info(f"GET HERE ******************************** : {data}", exc_info=True)
|
||||||
subscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
subscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
||||||
|
|
||||||
provision_activities = ProvisionActions.get_provision_action_by_product_uid(subscription.uid, 4)
|
provision_activities = ProvisionActions.get_provision_action_by_product_uid(subscription.uid, 4)
|
||||||
provision_activities_data =[]
|
provision_activities_data = []
|
||||||
for t in provision_activities:
|
for t in provision_activities:
|
||||||
provision_activities_data.append({
|
provision_activities_data.append({
|
||||||
'id': t.id,
|
'id': t.id,
|
||||||
'uid': t.uid,
|
'uid': t.uid,
|
||||||
'action': t.action,
|
'action': t.action,
|
||||||
'added': t.added.isoformat() if t.added else None,
|
'added': t.added.isoformat() if t.added else None,
|
||||||
})
|
})
|
||||||
|
|
||||||
response_data = {
|
response_data = {
|
||||||
@@ -105,8 +154,6 @@ class MyProductsService(BaseService):
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return ResponseHelper.internal_server_error()
|
return ResponseHelper.internal_server_error()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def process_subscription(data):
|
def process_subscription(data):
|
||||||
try:
|
try:
|
||||||
@@ -129,9 +176,9 @@ class MyProductsService(BaseService):
|
|||||||
}, 400
|
}, 400
|
||||||
|
|
||||||
logger.info(f"GET HERE ******************************** : {data}", exc_info=True)
|
logger.info(f"GET HERE ******************************** : {data}", exc_info=True)
|
||||||
mumberSub = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
mumberSub = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
||||||
|
|
||||||
if mumberSub:
|
if mumberSub:
|
||||||
logger.error(f"Ready to add data to tables")
|
logger.error(f"Ready to add data to tables")
|
||||||
response_data = {
|
response_data = {
|
||||||
"subscription": mumberSub,
|
"subscription": mumberSub,
|
||||||
@@ -142,10 +189,10 @@ class MyProductsService(BaseService):
|
|||||||
return ResponseHelper.success(data=response_data)
|
return ResponseHelper.success(data=response_data)
|
||||||
|
|
||||||
internal_url = str(random.randint(100000, 999999)) + ".devprov.mermsemr.com"
|
internal_url = str(random.randint(100000, 999999)) + ".devprov.mermsemr.com"
|
||||||
#INSERT_NEW_PRODUCT = "INSERT INTO members_products (member_id ,product_id,status,internal_url) VALUES (%s, %s, %s, %s)"
|
# INSERT_NEW_PRODUCT = "INSERT INTO members_products (member_id ,product_id,status,internal_url) VALUES (%s, %s, %s, %s)"
|
||||||
# val_insert = (member_id, product_id,6,internal_url)
|
# val_insert = (member_id, product_id,6,internal_url)
|
||||||
status = 6
|
status = 6
|
||||||
subscription = MembersProducts.create_subscription(member_id ,product_id,status,internal_url)
|
subscription = MembersProducts.create_subscription(member_id, product_id, status, internal_url)
|
||||||
|
|
||||||
response_data = {
|
response_data = {
|
||||||
"subscription_uid": subscription.uid,
|
"subscription_uid": subscription.uid,
|
||||||
@@ -173,8 +220,6 @@ class MyProductsService(BaseService):
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return ResponseHelper.internal_server_error()
|
return ResponseHelper.internal_server_error()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def process_settings(data):
|
def process_settings(data):
|
||||||
try:
|
try:
|
||||||
@@ -191,7 +236,6 @@ class MyProductsService(BaseService):
|
|||||||
product_id = validated_data.get('product_id')
|
product_id = validated_data.get('product_id')
|
||||||
product_settings = validated_data.get('settings')
|
product_settings = validated_data.get('settings')
|
||||||
|
|
||||||
|
|
||||||
memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
||||||
if memberSubscription is not None:
|
if memberSubscription is not None:
|
||||||
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
||||||
@@ -210,7 +254,8 @@ class MyProductsService(BaseService):
|
|||||||
for key in settings.keys():
|
for key in settings.keys():
|
||||||
setting_value = settings[key]
|
setting_value = settings[key]
|
||||||
subscription_uid = memberSubscription.uid
|
subscription_uid = memberSubscription.uid
|
||||||
MembersProductsSettings.save_update_product_settings(member_id,subscription_uid,product_id,key, 'TXT', setting_value)
|
MembersProductsSettings.save_update_product_settings(member_id, subscription_uid, product_id, key,
|
||||||
|
'TXT', setting_value)
|
||||||
|
|
||||||
# Simulate processing
|
# Simulate processing
|
||||||
response_data = {
|
response_data = {
|
||||||
@@ -219,7 +264,8 @@ class MyProductsService(BaseService):
|
|||||||
"uid": str(uid),
|
"uid": str(uid),
|
||||||
}
|
}
|
||||||
logger.error(f"Going for Thread ******************** ")
|
logger.error(f"Going for Thread ******************** ")
|
||||||
thread = Thread(target=MyProductsService.async_send_settings_refresh_to_kafka, args=(response_data, subscription_uid, "REFRESH_PRODUCT_SETTINGS"))
|
thread = Thread(target=MyProductsService.async_send_settings_refresh_to_kafka,
|
||||||
|
args=(response_data, subscription_uid, "REFRESH_PRODUCT_SETTINGS"))
|
||||||
thread.start()
|
thread.start()
|
||||||
logger.error(f"After the Thread ******************** ")
|
logger.error(f"After the Thread ******************** ")
|
||||||
|
|
||||||
@@ -252,35 +298,34 @@ class MyProductsService(BaseService):
|
|||||||
member_data = Members.get_member_by_uid(uid)
|
member_data = Members.get_member_by_uid(uid)
|
||||||
member_id = member_data.id
|
member_id = member_data.id
|
||||||
product_id = validated_data.get('product_id')
|
product_id = validated_data.get('product_id')
|
||||||
product_subscription_uid=''
|
product_subscription_uid = ''
|
||||||
product_subscription_external_url = ''
|
product_subscription_external_url = ''
|
||||||
product_subscription_internal_url = ''
|
product_subscription_internal_url = ''
|
||||||
product_data = Products.get_product_by_product_id(product_id)
|
product_data = Products.get_product_by_product_id(product_id)
|
||||||
product_description = ProductsDetails.get_product_details_with_product_id(product_id)
|
product_description = ProductsDetails.get_product_details_with_product_id(product_id)
|
||||||
productDataStatus = product_data.status
|
productDataStatus = product_data.status
|
||||||
|
|
||||||
memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id)
|
||||||
if memberSubscription is not None:
|
if memberSubscription is not None:
|
||||||
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
||||||
productDataStatus = memberSubscription.status
|
productDataStatus = memberSubscription.status
|
||||||
product_subscription_uid = memberSubscription.uid
|
product_subscription_uid = memberSubscription.uid
|
||||||
product_subscription_external_url = memberSubscription.external_url
|
product_subscription_external_url = memberSubscription.external_url
|
||||||
product_subscription_internal_url = memberSubscription.internal_url
|
product_subscription_internal_url = memberSubscription.internal_url
|
||||||
|
|
||||||
|
|
||||||
# "banner": "banner.jpg",
|
# "banner": "banner.jpg",
|
||||||
myproduct_data = {
|
myproduct_data = {
|
||||||
"myproudct": {
|
"myproudct": {
|
||||||
"banner": product_data.banner,
|
"banner": product_data.banner,
|
||||||
"description": product_description.details,
|
"description": product_description.details,
|
||||||
"sale_text" : product_description.sale_text,
|
"sale_text": product_description.sale_text,
|
||||||
"internal_url": product_subscription_internal_url,
|
"internal_url": product_subscription_internal_url,
|
||||||
"external_url": product_subscription_external_url,
|
"external_url": product_subscription_external_url,
|
||||||
"price_text": "90 days free and 3.95/Month",
|
"price_text": "90 days free and 3.95/Month",
|
||||||
"product_id": product_data.product_id,
|
"product_id": product_data.product_id,
|
||||||
"product_name": product_data.name,
|
"product_name": product_data.name,
|
||||||
"product_subscription_uid": product_subscription_uid,
|
"product_subscription_uid": product_subscription_uid,
|
||||||
"product_uid": product_data.uid,
|
"product_uid": product_data.uid,
|
||||||
"promotion_text": "Start Free Today !",
|
"promotion_text": "Start Free Today !",
|
||||||
"subscription_uid": product_subscription_uid,
|
"subscription_uid": product_subscription_uid,
|
||||||
"status": productDataStatus,
|
"status": productDataStatus,
|
||||||
@@ -336,12 +381,13 @@ class MyProductsService(BaseService):
|
|||||||
if memberSubscription is not None:
|
if memberSubscription is not None:
|
||||||
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}")
|
||||||
product_subscription_uid = memberSubscription.uid
|
product_subscription_uid = memberSubscription.uid
|
||||||
settings_data_result = MembersProductsSettings.get_product_settings_by_product_id_and_member_id(product_id, member_id)
|
settings_data_result = MembersProductsSettings.get_product_settings_by_product_id_and_member_id(
|
||||||
|
product_id, member_id)
|
||||||
if settings_data_result is not None:
|
if settings_data_result is not None:
|
||||||
for t in settings_data_result:
|
for t in settings_data_result:
|
||||||
settings_data.append({
|
settings_data.append({
|
||||||
'setting_key': t.settings_key,
|
'setting_key': t.settings_key,
|
||||||
'setting_value': t.setting_value,
|
'setting_value': t.setting_value,
|
||||||
})
|
})
|
||||||
|
|
||||||
# Simulate processing
|
# Simulate processing
|
||||||
@@ -368,4 +414,3 @@ class MyProductsService(BaseService):
|
|||||||
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return ResponseHelper.internal_server_error()
|
return ResponseHelper.internal_server_error()
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from app.utils.logger import logger
|
|||||||
from app.api.services.base_service import BaseService
|
from app.api.services.base_service import BaseService
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.models import Offer, MembersPending, Members
|
from app.models import MembersPending, Members
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
+15
-12
@@ -1,16 +1,16 @@
|
|||||||
from .customer import Customer
|
# from .customer import Customer
|
||||||
from .account import Account
|
from .account import Account
|
||||||
from .loan import Loan
|
# from .loan import Loan
|
||||||
from .transaction import Transaction
|
# from .transaction import Transaction
|
||||||
from .repayment import Repayment
|
# from .repayment import Repayment
|
||||||
from .loan_charge import LoanCharge
|
# from .loan_charge import LoanCharge
|
||||||
from .offer import Offer
|
# from .offer import Offer
|
||||||
from .charge import Charge
|
# from .charge import Charge
|
||||||
from .rac_checks import RACCheck
|
# from .rac_checks import RACCheck
|
||||||
from .loan_repayment_schedule import LoanRepaymentSchedule
|
# from .loan_repayment_schedule import LoanRepaymentSchedule
|
||||||
from .transaction_offers import TransactionOffer
|
# 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 .products import Products
|
||||||
from .members_products import MembersProducts
|
from .members_products import MembersProducts
|
||||||
@@ -24,6 +24,8 @@ from .members_products_settings import MembersProductsSettings
|
|||||||
from .members_profile import MembersProfile
|
from .members_profile import MembersProfile
|
||||||
from .subscription_options import SubscriptionOptions
|
from .subscription_options import SubscriptionOptions
|
||||||
from .subscription_options_items import SubscriptionOptionsItems
|
from .subscription_options_items import SubscriptionOptionsItems
|
||||||
|
from .products_templates import ProductsTemplates
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -32,6 +34,7 @@ __all__ = ['Members','Customer', 'Account', 'Products',
|
|||||||
'MembersProducts', 'MembersActions', 'MembersPending', 'ProductsDetails',
|
'MembersProducts', 'MembersActions', 'MembersPending', 'ProductsDetails',
|
||||||
'ProvisionActions', 'MembersProductsRefresh','MembersProductsSettings',
|
'ProvisionActions', 'MembersProductsRefresh','MembersProductsSettings',
|
||||||
'PasswordReset','MembersProfile','SubscriptionOptions','SubscriptionOptionsItems',
|
'PasswordReset','MembersProfile','SubscriptionOptions','SubscriptionOptionsItems',
|
||||||
|
'ProductsTemplates',
|
||||||
|
|
||||||
'Loan', 'Transaction', 'Repayment',
|
'Loan', 'Transaction', 'Repayment',
|
||||||
'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule',
|
'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule',
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ class Account(db.Model):
|
|||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
|
|
||||||
customer = relationship(
|
# customer = relationship(
|
||||||
"Customer",
|
# "Customer",
|
||||||
primaryjoin="Customer.id == Account.customer_id",
|
# primaryjoin="Customer.id == Account.customer_id",
|
||||||
foreign_keys=[customer_id],
|
# foreign_keys=[customer_id],
|
||||||
back_populates="accounts",
|
# back_populates="accounts",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_account(cls, id, customer_id, account_type, status='active'):
|
def create_account(cls, id, customer_id, account_type, status='active'):
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ class Charge(db.Model):
|
|||||||
due = db.Column(db.Integer, nullable=False)
|
due = db.Column(db.Integer, nullable=False)
|
||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
offer = relationship(
|
# offer = relationship(
|
||||||
"Offer",
|
# "Offer",
|
||||||
primaryjoin="Charge.offer_id == Offer.id",
|
# primaryjoin="Charge.offer_id == Offer.id",
|
||||||
foreign_keys=[offer_id],
|
# foreign_keys=[offer_id],
|
||||||
back_populates="charges",
|
# back_populates="charges",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def add_charges(cls, offer_id, charges):
|
def add_charges(cls, offer_id, charges):
|
||||||
|
|||||||
+18
-18
@@ -16,26 +16,26 @@ class Customer(db.Model):
|
|||||||
country_code = db.Column(db.String(3), nullable=False)
|
country_code = db.Column(db.String(3), nullable=False)
|
||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
accounts = relationship(
|
# accounts = relationship(
|
||||||
"Account",
|
# # "Account",
|
||||||
primaryjoin="Customer.id == Account.customer_id",
|
# # primaryjoin="Customer.id == Account.customer_id",
|
||||||
foreign_keys="Account.customer_id",
|
# # foreign_keys="Account.customer_id",
|
||||||
back_populates="customer",
|
# # back_populates="customer",
|
||||||
)
|
# # )
|
||||||
|
|
||||||
loans = relationship(
|
# loans = relationship(
|
||||||
"Loan",
|
# "Loan",
|
||||||
primaryjoin="Customer.id == Loan.customer_id",
|
# primaryjoin="Customer.id == Loan.customer_id",
|
||||||
foreign_keys="Loan.customer_id",
|
# foreign_keys="Loan.customer_id",
|
||||||
back_populates="customer",
|
# back_populates="customer",
|
||||||
)
|
# )
|
||||||
|
|
||||||
transaction_offers = relationship(
|
# transaction_offers = relationship(
|
||||||
"TransactionOffer",
|
# "TransactionOffer",
|
||||||
primaryjoin="Customer.id == TransactionOffer.customer_id",
|
# primaryjoin="Customer.id == TransactionOffer.customer_id",
|
||||||
foreign_keys="TransactionOffer.customer_id",
|
# foreign_keys="TransactionOffer.customer_id",
|
||||||
back_populates="customer",
|
# back_populates="customer",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_valid_customer(cls, customer_id):
|
def is_valid_customer(cls, customer_id):
|
||||||
|
|||||||
+6
-6
@@ -50,12 +50,12 @@ class Loan(db.Model):
|
|||||||
verify_result = db.Column(db.String(10), nullable=True)
|
verify_result = db.Column(db.String(10), nullable=True)
|
||||||
verify_description = db.Column(db.String(100), nullable=True)
|
verify_description = db.Column(db.String(100), nullable=True)
|
||||||
|
|
||||||
customer = relationship(
|
# customer = relationship(
|
||||||
"Customer",
|
# "Customer",
|
||||||
primaryjoin="Customer.id == Loan.customer_id",
|
# primaryjoin="Customer.id == Loan.customer_id",
|
||||||
foreign_keys=[customer_id],
|
# foreign_keys=[customer_id],
|
||||||
back_populates="loans",
|
# back_populates="loans",
|
||||||
)
|
# )
|
||||||
|
|
||||||
loan_charges = relationship(
|
loan_charges = relationship(
|
||||||
"LoanCharge",
|
"LoanCharge",
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ class LoanCharge(db.Model):
|
|||||||
due_date = db.Column(db.DateTime, nullable=True)
|
due_date = db.Column(db.DateTime, nullable=True)
|
||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
loan = relationship(
|
# loan = relationship(
|
||||||
"Loan",
|
# "Loan",
|
||||||
primaryjoin="LoanCharge.loan_id == Loan.id",
|
# primaryjoin="LoanCharge.loan_id == Loan.id",
|
||||||
foreign_keys=[loan_id],
|
# foreign_keys=[loan_id],
|
||||||
back_populates="loan_charges",
|
# back_populates="loan_charges",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_charges_for_loan(cls, loan_id, transaction_id, charges, referenced_amount = 0.0):
|
def create_charges_for_loan(cls, loan_id, transaction_id, charges, referenced_amount = 0.0):
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ class LoanRepaymentSchedule(db.Model):
|
|||||||
|
|
||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
loan = relationship(
|
# loan = relationship(
|
||||||
"Loan",
|
# "Loan",
|
||||||
primaryjoin="LoanRepaymentSchedule.loan_id == Loan.id",
|
# primaryjoin="LoanRepaymentSchedule.loan_id == Loan.id",
|
||||||
foreign_keys=[loan_id],
|
# foreign_keys=[loan_id],
|
||||||
back_populates="loan_repayment_schedules",
|
# back_populates="loan_repayment_schedules",
|
||||||
)
|
# )
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
+6
-6
@@ -24,12 +24,12 @@ class Offer(db.Model):
|
|||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
|
|
||||||
charges = relationship(
|
# charges = relationship(
|
||||||
"Charge",
|
# "Charge",
|
||||||
primaryjoin="Offer.id == Charge.offer_id",
|
# primaryjoin="Offer.id == Charge.offer_id",
|
||||||
foreign_keys="Charge.offer_id",
|
# foreign_keys="Charge.offer_id",
|
||||||
back_populates="offer",
|
# back_populates="offer",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_all_offers(cls):
|
def get_all_offers(cls):
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
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__ = 'payments'
|
||||||
|
|
||||||
|
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'<LoanOffer {self.id}>'
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
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 ProductsTemplates(db.Model):
|
||||||
|
__tablename__ = 'products_templates'
|
||||||
|
|
||||||
|
id = db.Column(db.String, primary_key=True)
|
||||||
|
uid = db.Column(db.String, nullable=False)
|
||||||
|
product_id = db.Column(db.String, nullable=False)
|
||||||
|
name = db.Column(db.String, nullable=False)
|
||||||
|
status = db.Column(db.Integer, nullable=True, default=1)
|
||||||
|
owner_uid = db.Column(db.String, nullable=False)
|
||||||
|
provision_name = db.Column(db.String, nullable=False)
|
||||||
|
added = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_template_by_product_id(cls, product_id):
|
||||||
|
templates = cls.query.filter_by(product_id=str(product_id)).all()
|
||||||
|
|
||||||
|
if not templates:
|
||||||
|
raise ValueError(f"Templates with Product ID {product_id} not found")
|
||||||
|
return templates
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
return {
|
||||||
|
"id": self.id,
|
||||||
|
"uid": self.uid,
|
||||||
|
"product_id": self.product_id,
|
||||||
|
"name": self.name,
|
||||||
|
"status": self.status,
|
||||||
|
"owner_uid": self.owner_uid,
|
||||||
|
"provision_name": self.provision_name,
|
||||||
|
"provision_name": self.provision_name
|
||||||
|
}
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f'<LoanOffer {self.id}>'
|
||||||
@@ -24,12 +24,12 @@ class TransactionOffer(db.Model):
|
|||||||
|
|
||||||
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
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())
|
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||||
customer = relationship(
|
# customer = relationship(
|
||||||
"Customer",
|
# "Customer",
|
||||||
primaryjoin="Customer.id == TransactionOffer.customer_id",
|
# primaryjoin="Customer.id == TransactionOffer.customer_id",
|
||||||
foreign_keys=[customer_id],
|
# foreign_keys=[customer_id],
|
||||||
back_populates="transaction_offers",
|
# back_populates="transaction_offers",
|
||||||
)
|
# )
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_valid_transaction_offer(cls, transaction_offer, customer_id, product_id):
|
def is_valid_transaction_offer(cls, transaction_offer, customer_id, product_id):
|
||||||
|
|||||||
Reference in New Issue
Block a user