diff --git a/SQL/site_data.sql b/SQL/site_data.sql index cc1e6b1..ecdc1ef 100644 --- a/SQL/site_data.sql +++ b/SQL/site_data.sql @@ -228,6 +228,66 @@ merms_panel=# select product_id,description from products; A000005 | Get Open EMR for practice management (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 ( diff --git a/app/api/services/__init__.py b/app/api/services/__init__.py index 02d4a2d..b8f817e 100644 --- a/app/api/services/__init__.py +++ b/app/api/services/__init__.py @@ -1,12 +1,12 @@ -from app.api.services.eligibility_check import EligibilityCheckService -from app.api.services.select_offer import SelectOfferService -from app.api.services.provide_loan import ProvideLoanService -from app.api.services.loan_status import LoanStatusService -from app.api.services.repayment import RepaymentService -from app.api.services.customer_consent import CustomerConsentService -from app.api.services.notification_callback import NotificationCallbackService +# from app.api.services.eligibility_check import EligibilityCheckService +# from app.api.services.select_offer import SelectOfferService +# from app.api.services.provide_loan import ProvideLoanService +# from app.api.services.loan_status import LoanStatusService +# from app.api.services.repayment import RepaymentService +# from app.api.services.customer_consent import CustomerConsentService +# from app.api.services.notification_callback import NotificationCallbackService 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.register import RegisterService from app.api.services.products import ProductsService diff --git a/app/api/services/account.py b/app/api/services/account.py index f45eb57..ea6c30f 100644 --- a/app/api/services/account.py +++ b/app/api/services/account.py @@ -2,7 +2,7 @@ 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 diff --git a/app/api/services/base_service.py b/app/api/services/base_service.py index 3c69a0e..f24a8ae 100644 --- a/app/api/services/base_service.py +++ b/app/api/services/base_service.py @@ -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 flask import jsonify from marshmallow import ValidationError diff --git a/app/api/services/contacts.py b/app/api/services/contacts.py index ca3c6e1..26c23ee 100644 --- a/app/api/services/contacts.py +++ b/app/api/services/contacts.py @@ -9,7 +9,7 @@ from marshmallow import ValidationError from app.extensions import db 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 werkzeug.security import generate_password_hash, check_password_hash # from app.api.schemas.register import RegisterSchema diff --git a/app/api/services/customer_consent.py b/app/api/services/customer_consent.py index e2663d3..f787ee7 100644 --- a/app/api/services/customer_consent.py +++ b/app/api/services/customer_consent.py @@ -1,9 +1,9 @@ from flask import request, jsonify 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 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.enums import TransactionType from app.extensions import db diff --git a/app/api/services/myproduct.py b/app/api/services/myproduct.py index 38b06c6..af51ec7 100644 --- a/app/api/services/myproduct.py +++ b/app/api/services/myproduct.py @@ -3,7 +3,8 @@ from app.utils.logger import logger from app.api.services.base_service import BaseService from marshmallow import ValidationError 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.schemas.myproduct import MyProductSchema from app.api.schemas.provision import ProvisionSchema @@ -15,6 +16,7 @@ import jwt import random from app.config import Config + class MyProductsService(BaseService): @staticmethod @@ -22,28 +24,75 @@ class MyProductsService(BaseService): pass @staticmethod - def mpproduct_template_data(): - # class MyProductSchema(Schema): - # token = fields.Str(required=True) - # uid = fields.Str(required=True) - # product_id = fields.Str(required=True) + def mpproduct_template_data(data): + try: + with db.session.begin(): + logger.info(f"Incoming MyProduct data ==>>>> {data}") + 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 = { - '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' }, - } + product_id = validated_data.get('product_id') - response_data = { - "templates": template_data, - "last_update": datetime.datetime.utcnow(), - } - return ResponseHelper.success(data=response_data) + # class MyProductSchema(Schema): + # token = fields.Str(required=True) + # uid = fields.Str(required=True) + # product_id = fields.Str(required=True) + 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 def process_provision(data): @@ -67,16 +116,16 @@ class MyProductsService(BaseService): }, 400 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_data =[] + provision_activities_data = [] for t in provision_activities: provision_activities_data.append({ - 'id': t.id, - 'uid': t.uid, - 'action': t.action, - 'added': t.added.isoformat() if t.added else None, + 'id': t.id, + 'uid': t.uid, + 'action': t.action, + 'added': t.added.isoformat() if t.added else None, }) response_data = { @@ -105,8 +154,6 @@ class MyProductsService(BaseService): db.session.rollback() return ResponseHelper.internal_server_error() - - @staticmethod def process_subscription(data): try: @@ -129,9 +176,9 @@ class MyProductsService(BaseService): }, 400 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") response_data = { "subscription": mumberSub, @@ -142,10 +189,10 @@ class MyProductsService(BaseService): return ResponseHelper.success(data=response_data) 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) 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 = { "subscription_uid": subscription.uid, @@ -173,8 +220,6 @@ class MyProductsService(BaseService): db.session.rollback() return ResponseHelper.internal_server_error() - - @staticmethod def process_settings(data): try: @@ -191,7 +236,6 @@ class MyProductsService(BaseService): product_id = validated_data.get('product_id') product_settings = validated_data.get('settings') - memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) if memberSubscription is not None: logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") @@ -210,7 +254,8 @@ class MyProductsService(BaseService): for key in settings.keys(): setting_value = settings[key] 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 response_data = { @@ -219,7 +264,8 @@ class MyProductsService(BaseService): "uid": str(uid), } 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() logger.error(f"After the Thread ******************** ") @@ -252,35 +298,34 @@ class MyProductsService(BaseService): member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') - product_subscription_uid='' + product_subscription_uid = '' product_subscription_external_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) 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: logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") productDataStatus = memberSubscription.status - product_subscription_uid = memberSubscription.uid + product_subscription_uid = memberSubscription.uid product_subscription_external_url = memberSubscription.external_url product_subscription_internal_url = memberSubscription.internal_url - # "banner": "banner.jpg", myproduct_data = { "myproudct": { "banner": product_data.banner, "description": product_description.details, - "sale_text" : product_description.sale_text, + "sale_text": product_description.sale_text, "internal_url": product_subscription_internal_url, "external_url": product_subscription_external_url, "price_text": "90 days free and 3.95/Month", - "product_id": product_data.product_id, - "product_name": product_data.name, + "product_id": product_data.product_id, + "product_name": product_data.name, "product_subscription_uid": product_subscription_uid, - "product_uid": product_data.uid, + "product_uid": product_data.uid, "promotion_text": "Start Free Today !", "subscription_uid": product_subscription_uid, "status": productDataStatus, @@ -336,12 +381,13 @@ class MyProductsService(BaseService): if memberSubscription is not None: logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") 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: for t in settings_data_result: settings_data.append({ - 'setting_key': t.settings_key, - 'setting_value': t.setting_value, + 'setting_key': t.settings_key, + 'setting_value': t.setting_value, }) # Simulate processing @@ -368,4 +414,3 @@ class MyProductsService(BaseService): logger.error(f"An error occurred: {str(e)}", exc_info=True) db.session.rollback() return ResponseHelper.internal_server_error() - diff --git a/app/api/services/register.py b/app/api/services/register.py index b8584a1..4a880c4 100644 --- a/app/api/services/register.py +++ b/app/api/services/register.py @@ -3,7 +3,7 @@ from app.utils.logger import logger from app.api.services.base_service import BaseService from marshmallow import ValidationError 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 werkzeug.security import generate_password_hash, check_password_hash diff --git a/app/models/__init__.py b/app/models/__init__.py index 5e46d00..a4a2489 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -1,16 +1,16 @@ -from .customer import Customer +# from .customer import Customer from .account import Account -from .loan import Loan -from .transaction import Transaction -from .repayment import Repayment -from .loan_charge import LoanCharge -from .offer import Offer -from .charge import Charge -from .rac_checks import RACCheck -from .loan_repayment_schedule import LoanRepaymentSchedule -from .transaction_offers import TransactionOffer -from .repayments_data import RepaymentsData -from .salary import Salary +# from .loan import Loan +# from .transaction import Transaction +# from .repayment import Repayment +# from .loan_charge import LoanCharge +# from .offer import Offer +# from .charge import Charge +# from .rac_checks import RACCheck +# from .loan_repayment_schedule import LoanRepaymentSchedule +# 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 @@ -24,6 +24,8 @@ from .members_products_settings import MembersProductsSettings from .members_profile import MembersProfile from .subscription_options import SubscriptionOptions from .subscription_options_items import SubscriptionOptionsItems +from .products_templates import ProductsTemplates + @@ -32,6 +34,7 @@ __all__ = ['Members','Customer', 'Account', 'Products', 'MembersProducts', 'MembersActions', 'MembersPending', 'ProductsDetails', 'ProvisionActions', 'MembersProductsRefresh','MembersProductsSettings', 'PasswordReset','MembersProfile','SubscriptionOptions','SubscriptionOptionsItems', + 'ProductsTemplates', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', diff --git a/app/models/account.py b/app/models/account.py index 30774e7..3ff7038 100644 --- a/app/models/account.py +++ b/app/models/account.py @@ -15,12 +15,12 @@ class Account(db.Model): 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()) - customer = relationship( - "Customer", - primaryjoin="Customer.id == Account.customer_id", - foreign_keys=[customer_id], - back_populates="accounts", - ) + # customer = relationship( + # "Customer", + # primaryjoin="Customer.id == Account.customer_id", + # foreign_keys=[customer_id], + # back_populates="accounts", + # ) @classmethod def create_account(cls, id, customer_id, account_type, status='active'): diff --git a/app/models/charge.py b/app/models/charge.py index 91fa42c..9352ee4 100644 --- a/app/models/charge.py +++ b/app/models/charge.py @@ -15,12 +15,12 @@ class Charge(db.Model): due = db.Column(db.Integer, nullable=False) 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()) - offer = relationship( - "Offer", - primaryjoin="Charge.offer_id == Offer.id", - foreign_keys=[offer_id], - back_populates="charges", - ) + # offer = relationship( + # "Offer", + # primaryjoin="Charge.offer_id == Offer.id", + # foreign_keys=[offer_id], + # back_populates="charges", + # ) @classmethod def add_charges(cls, offer_id, charges): diff --git a/app/models/customer.py b/app/models/customer.py index 1469dad..e2c73f0 100644 --- a/app/models/customer.py +++ b/app/models/customer.py @@ -16,26 +16,26 @@ class Customer(db.Model): country_code = db.Column(db.String(3), nullable=False) 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()) - accounts = relationship( - "Account", - primaryjoin="Customer.id == Account.customer_id", - foreign_keys="Account.customer_id", - back_populates="customer", - ) + # accounts = relationship( + # # "Account", + # # primaryjoin="Customer.id == Account.customer_id", + # # foreign_keys="Account.customer_id", + # # back_populates="customer", + # # ) - loans = relationship( - "Loan", - primaryjoin="Customer.id == Loan.customer_id", - foreign_keys="Loan.customer_id", - back_populates="customer", - ) + # loans = relationship( + # "Loan", + # primaryjoin="Customer.id == Loan.customer_id", + # foreign_keys="Loan.customer_id", + # back_populates="customer", + # ) - transaction_offers = relationship( - "TransactionOffer", - primaryjoin="Customer.id == TransactionOffer.customer_id", - foreign_keys="TransactionOffer.customer_id", - back_populates="customer", - ) + # transaction_offers = relationship( + # "TransactionOffer", + # primaryjoin="Customer.id == TransactionOffer.customer_id", + # foreign_keys="TransactionOffer.customer_id", + # back_populates="customer", + # ) @classmethod def is_valid_customer(cls, customer_id): diff --git a/app/models/loan.py b/app/models/loan.py index 6c22a51..e8c1b11 100644 --- a/app/models/loan.py +++ b/app/models/loan.py @@ -50,12 +50,12 @@ class Loan(db.Model): verify_result = db.Column(db.String(10), nullable=True) verify_description = db.Column(db.String(100), nullable=True) - customer = relationship( - "Customer", - primaryjoin="Customer.id == Loan.customer_id", - foreign_keys=[customer_id], - back_populates="loans", - ) + # customer = relationship( + # "Customer", + # primaryjoin="Customer.id == Loan.customer_id", + # foreign_keys=[customer_id], + # back_populates="loans", + # ) loan_charges = relationship( "LoanCharge", diff --git a/app/models/loan_charge.py b/app/models/loan_charge.py index ce9ca22..8040437 100644 --- a/app/models/loan_charge.py +++ b/app/models/loan_charge.py @@ -19,12 +19,12 @@ class LoanCharge(db.Model): due_date = db.Column(db.DateTime, 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()) - loan = relationship( - "Loan", - primaryjoin="LoanCharge.loan_id == Loan.id", - foreign_keys=[loan_id], - back_populates="loan_charges", - ) + # loan = relationship( + # "Loan", + # primaryjoin="LoanCharge.loan_id == Loan.id", + # foreign_keys=[loan_id], + # back_populates="loan_charges", + # ) @classmethod def create_charges_for_loan(cls, loan_id, transaction_id, charges, referenced_amount = 0.0): diff --git a/app/models/loan_repayment_schedule.py b/app/models/loan_repayment_schedule.py index 948b66a..73dc88f 100644 --- a/app/models/loan_repayment_schedule.py +++ b/app/models/loan_repayment_schedule.py @@ -20,12 +20,12 @@ class LoanRepaymentSchedule(db.Model): 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()) - loan = relationship( - "Loan", - primaryjoin="LoanRepaymentSchedule.loan_id == Loan.id", - foreign_keys=[loan_id], - back_populates="loan_repayment_schedules", - ) + # loan = relationship( + # "Loan", + # primaryjoin="LoanRepaymentSchedule.loan_id == Loan.id", + # foreign_keys=[loan_id], + # back_populates="loan_repayment_schedules", + # ) @classmethod diff --git a/app/models/offer.py b/app/models/offer.py index a3250ae..506345e 100644 --- a/app/models/offer.py +++ b/app/models/offer.py @@ -24,12 +24,12 @@ class Offer(db.Model): 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", - ) + # charges = relationship( + # "Charge", + # primaryjoin="Offer.id == Charge.offer_id", + # foreign_keys="Charge.offer_id", + # back_populates="offer", + # ) @classmethod def get_all_offers(cls): diff --git a/app/models/payments.py b/app/models/payments.py new file mode 100644 index 0000000..d3c9553 --- /dev/null +++ b/app/models/payments.py @@ -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'' \ No newline at end of file diff --git a/app/models/products_templates.py b/app/models/products_templates.py new file mode 100644 index 0000000..9c7948f --- /dev/null +++ b/app/models/products_templates.py @@ -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'' \ No newline at end of file diff --git a/app/models/transaction_offers.py b/app/models/transaction_offers.py index b0e7508..4e57738 100644 --- a/app/models/transaction_offers.py +++ b/app/models/transaction_offers.py @@ -24,12 +24,12 @@ class TransactionOffer(db.Model): 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()) - customer = relationship( - "Customer", - primaryjoin="Customer.id == TransactionOffer.customer_id", - foreign_keys=[customer_id], - back_populates="transaction_offers", - ) + # customer = relationship( + # "Customer", + # primaryjoin="Customer.id == TransactionOffer.customer_id", + # foreign_keys=[customer_id], + # back_populates="transaction_offers", + # ) @classmethod def is_valid_transaction_offer(cls, transaction_offer, customer_id, product_id):