HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/thread-self/root/home/arjun/projects/buyercall/buyercall/blueprints/partnership/endpoints.py
import json
import logging as log
import math
import uuid

from flask import Blueprint, jsonify, request, current_app
from flask_login import current_user
from flask_login.utils import login_required

from buyercall.blueprints.contacts.models import Contact
from buyercall.blueprints.email.models import EmailIdentity
from buyercall.blueprints.form_leads.models import FormLead
from buyercall.blueprints.issue.models import Issue
from buyercall.blueprints.leads.models import Lead
from buyercall.blueprints.notification.utilities import send_notifications
from buyercall.blueprints.partnership.models import Partnership, PartnershipAccount, PartnershipAccountOperatingHours
from buyercall.blueprints.partnership.serializers import PartnershipAccountOutSchema, \
    PartnershipAccountOperatingHoursOutSchema
from buyercall.blueprints.phonenumbers.models import Phone
from buyercall.blueprints.sms.models import Message
from buyercall.blueprints.user.decorators import role_required, api_role_required
from buyercall.blueprints.user.models import User
from buyercall.extensions import ses_client
from buyercall.lib.util_crypto import AESCipherDome
from buyercall.lib.util_datetime import tza_to_date
from buyercall.lib.util_query import get_by_partnership_account_expr
from buyercall.lib.util_rest import api_jsonify

partnership_api = Blueprint('partnershipapi', __name__, url_prefix='/api/partnership')
logger = log.getLogger(__name__)


@role_required('partner', 'sysadmin')
def update_partnership(sid):
    try:
        if request.method == 'POST':
            status_code = 200
            success = True
            message = "Partnership details updated successfully!"
            data = []
            partnership = None
            avatar_large = request.files.get('file', None)
            avatar_small = request.files.get('filesmall', None)

            partnership_data = request.form.get('data', None)
            if partnership_data:
                try:
                    partnership_data = json.loads(partnership_data)
                except:
                    partnership_data = {}

            partnership = Partnership.query.filter(Partnership.sid == sid).first()
            if partnership_data and partnership:
                if partnership_data.get('partnershipName', None):
                    partnership.name = partnership_data.get('partnershipName')
                partnership.save()

            from buyercall.lib.util_boto3_s3 import generate_presigned_file_url, upload_file_object
            if avatar_large and partnership:
                result = None
                avatar_ext = avatar_large.filename.split('.')[-1]
                key = f'large_logos/partnership_logo_{partnership.sid}_lg.{avatar_ext}'
                resp = upload_file_object(avatar_large, current_app.config['PARTNERSHIP_BUCKET'], key)
                if resp:
                    partnership.logo = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                    partnership.save()
                else:
                    logger.error("Error in uploading the large logo.!")
                    status_code = 200
                    success = False
                    message = "Partnership large image uploading failed!"
                    data = []
            if avatar_small and partnership:
                result = None
                avatar_ext = avatar_small.filename.split('.')[-1]
                key = f'small_logos/partnership_logo_{partnership.sid}_sm.{avatar_ext}'
                resp = upload_file_object(avatar_small, current_app.config['PARTNERSHIP_BUCKET'], key)
                if resp:
                    partnership.logo_small = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                    partnership.save()
                else:
                    logger.error("Error in uploading the small logo.!")
                    status_code = 200
                    success = False
                    message = "Partnership small image uploading failed!"
                    data = []

            partner_email = partnership_data.get('partneruseremail', None)
            if partner_email:
                params = {
                    'role': 'partner',
                    'email': partner_email,
                    'password': 'password',
                    'company': partnership.name,
                    'tos_agreement': False,
                    'partnership_id': partnership.id
                }
                try:
                    u = User.query.filter(User.email == partner_email).first()
                    if not u:
                        partner = User(**params)
                        partner.save()
                        # send email invitation
                        reset_token = partner.serialize_token()
                        from buyercall.blueprints.user.tasks import send_partners_invitation_email
                        # TODO: can't call celery's delay() method. says not serializable
                        send_partners_invitation_email.delay(partner.id, reset_token, partnership.name)
                    else:
                        message += " Invited user already exists!"
                except Exception as e:
                    print(e)

        else:
            status_code = 200
            success = True
            message = "You sent a get request here!"
            data = []

    except Exception as e:
        print(e)
        status_code = 500
        success = False
        message = f"Partnership details fetching failed!"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@role_required('partner')
def white_label_config():
    try:
        status_code = 200
        success = True
        message = "Partnership details updated successfully!"
        data = []
        partnership = None
        partnership_data = request.get_json()

        pid = current_user.partnership_id
        partnership = Partnership.query.filter(Partnership.id == pid).first()
        if not partnership:
            partnership = Partnership.query.get(1)
        if 'data' in partnership_data:
            partnership_data = partnership_data['data']
            if partnership_data and partnership:
                if partnership_data.get('partnerUrl', None):
                    partnership.partner_url = partnership_data.get('partnerUrl')
                if partnership_data.get('systemEmail', None):
                    partnership.email_sender = partnership_data.get('systemEmail')
                if partnership_data.get('sidebarColor', None):
                    partnership.primary_color = partnership_data.get('sidebarColor')
                if 'isExpandedMenu' in partnership_data:
                    if isinstance(partnership_data.get('isExpandedMenu'), bool):
                        partnership.is_expanded_menu = partnership_data.get('isExpandedMenu')

                partnership.save()

    except Exception as e:
        status_code = 500
        success = False
        message = f"Partnership details updation failed!: {str(e)}"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@api_role_required('partner', 'sysadmin', 'admin')
def partnership_settings():
    """
    Updates/Retrieves user partnership.
    """
    try:
        if request.method == 'POST':
            try:
                status_code = 200
                success = True
                message = "Partnership details updated successfully!"
                data = []

                logo_large = request.files.get('file', None)
                logo_large_alt = request.files.get('fileAlt', None)
                logo_small = request.files.get('fileSmall', None)
                logo_small_alt = request.files.get('fileSmallAlt', None)

                partnership_data = request.form.get('data', None)

                if partnership_data:
                    try:
                        partnership_data = json.loads(partnership_data)
                    except:
                        partnership_data = {}

                partnership = Partnership.query.get(current_user.partnership_id)
                if partnership_data and partnership:
                    if partnership_data.get('partnershipName', None):
                        partnership.name = partnership_data.get('partnershipName')
                    if partnership_data.get('isLargeImageDeleted', None):
                        partnership.logo = ''
                    if partnership_data.get('isAltLargeImageDeleted', None):
                        partnership.alternative_logo = ''
                    if partnership_data.get('isSmallImageDeleted', None):
                        partnership.logo_small = ''
                    if partnership_data.get('isAltSmallImageDeleted', None):
                        partnership.alternative_logo_small = ''

                from buyercall.lib.util_boto3_s3 import generate_presigned_file_url, upload_file_object
                if logo_large and partnership:
                    avatar_ext = logo_large.filename.split('.')[-1]
                    key = f'large_logos/partnership_logo_{partnership.sid}_lg.{avatar_ext}'
                    resp = upload_file_object(logo_large, current_app.config['PARTNERSHIP_BUCKET'], key)
                    if resp:
                        # result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
                        result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                        partnership.logo = result
                    else:
                        status_code = 200
                        success = False
                        message = "Partnership large image uploading failed!"
                        data = []

                if logo_large_alt and partnership:
                    avatar_ext = logo_large_alt.filename.split('.')[-1]
                    key = f'large_logos/partnership_logo_{partnership.sid}_lg_alt.{avatar_ext}'
                    resp = upload_file_object(logo_large_alt, current_app.config['PARTNERSHIP_BUCKET'], key)
                    if resp:
                        # result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
                        result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                        partnership.alternative_logo = result
                    else:
                        status_code = 200
                        success = False
                        message = "Partnership alternative large image uploading failed!"
                        data = []

                if logo_small and partnership:
                    avatar_ext = logo_small.filename.split('.')[-1]
                    key = f'small_logos/partnership_logo_{partnership.sid}_sm.{avatar_ext}'
                    resp = upload_file_object(logo_small, current_app.config['PARTNERSHIP_BUCKET'], key)
                    if resp:
                        # result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
                        result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                        partnership.logo_small = result
                    else:
                        status_code = 200
                        success = False
                        message = "Partnership small image uploading failed!"
                        data = []
                if logo_small_alt and partnership:
                    avatar_ext = logo_small_alt.filename.split('.')[-1]
                    key = f'small_logos/partnership_logo_{partnership.sid}_sm_alt.{avatar_ext}'
                    resp = upload_file_object(logo_small_alt, current_app.config['PARTNERSHIP_BUCKET'], key)
                    if resp:
                        # result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
                        result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
                        partnership.alternative_logo_small = result
                    else:
                        status_code = 200
                        success = False
                        message = "Partnership small image uploading failed!"
                        data = []

                partnership.save()

                es_data = {
                    'user_id': current_user.sid,
                    'notify_message_type': 'PARTNERSHIP_SETTINGS_EDITED',
                    'user_related_entities': "You've",
                    'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
                    'hyperlink': f'{partnership.partner_url}/partnership/settings'
                }
                es_response = send_notifications(**es_data)
            except Exception as e:
                print('Errrrr ', e)
                status_code = 500
                success = False
                message = f"Partnership Fetching Failed!"
                data = []

        else:
            status_code = 200
            if current_user.partnership_id:
                user_partnership_id = current_user.partnership_id
            else:
                user_partnership_id = 1
            partnership = Partnership.query.get(user_partnership_id)
            message = 'Partnership fetched successfully!'
            success = True

            p_acs = partnership.partnership_accounts
            p_users = partnership.users
            is_restricted = True
            for pa in p_acs:
                if pa.active:
                    is_restricted = False
            for pu in p_users:
                if pu.active and pu.role in ['partner', 'agent', 'admin', 'member']:
                    is_restricted = False

            partner_image_lg = partnership.logo
            partner_image_lg_alt = partnership.alternative_logo
            partner_image_sm = partnership.logo_small
            partner_image_sm_alt = partnership.alternative_logo_small
            from buyercall.lib.util_boto3_s3 import generate_presigned_file_url
            if partnership.logo:
                if '::' in partnership.logo:
                    bucket_name, key = partnership.logo.split("::")
                    partner_image_lg = generate_presigned_file_url(key, bucket_name)

            if partnership.alternative_logo:
                if '::' in partnership.alternative_logo:
                    bucket_name, key = partnership.alternative_logo.split("::")
                    partner_image_lg_alt = generate_presigned_file_url(key, bucket_name)

            if partnership.logo_small:
                if '::' in partnership.logo_small:
                    bucket_name, key = partnership.logo_small.split("::")
                    partner_image_sm = generate_presigned_file_url(key, bucket_name)

            if partnership.alternative_logo_small:
                if '::' in partnership.alternative_logo_small:
                    bucket_name, key = partnership.alternative_logo_small.split("::")
                    partner_image_sm_alt = generate_presigned_file_url(key, bucket_name)

            enc_key = current_app.config['CRYPTO_SECRET_KEY']
            cipher = AESCipherDome(enc_key)

            dkim_records = []

            if partnership.dkim_records:
                for dkimr in partnership.dkim_records:
                    dkimr_decrypted = cipher.decrypt(dkimr)
                    dkim_records.append(
                        {
                            "type": "CNAME",
                            "name": f"{dkimr_decrypted}._domainkey.{partnership.partner_url}",
                            "value": f"{dkimr_decrypted}.dkim.amazonses.com"
                        }
                    )

            ses_identities = [partnership.email_sender, partnership.partner_url]
            identity_status = ses_client.check_identity_verify_status(ses_identities)
            ses_identity_status = []

            if 'VerificationAttributes' in identity_status['data']:
                for idt, val in identity_status['data']['VerificationAttributes'].items():
                    _idt = {'identityName': idt, 'identityStatus': val['VerificationStatus'],
                            'identityType': 'email' if '@' in idt else 'domain'}
                    ses_identity_status.append(_idt)

            data = {
                'name': partnership.name,
                'sid': partnership.sid,
                'isActive': partnership.active,
                'createdOn': tza_to_date(partnership.created_on),
                'updateOn': tza_to_date(partnership.updated_on),
                'partnerUrl': partnership.partner_url,
                'email': partnership.email_sender,
                'sidebarColor': partnership.primary_color,
                'partnerImage': partner_image_lg,
                'partnerImageAlt': partner_image_lg_alt,
                'partnerImageSmall': partner_image_sm,
                'partnerImageSmallAlt': partner_image_sm_alt,
                'isExpandedMenu': partnership.is_expanded_menu,
                'signUpLink': f"{partnership.partner_url}/signup?partnership={partnership.account_invitation_url_token}",
                'dkimRecords': dkim_records,
                'sesIdentityStatus': ses_identity_status,
            }
            users = []
            for u in partnership.users:
                if u.email and u.firstname and u.support_notification:
                    _user = {
                        'id': u.id,
                        'sid': u.sid,
                        'firstName': u.firstname,
                        'lastName': u.lastname,
                        'email': u.email,
                        'isActive': u.active,
                    }
                    users.append(_user)
            data['notificationUsers'] = users

            accounts = partnership.partnership_accounts
            # Placeholder initializatins
            campaigns = 0
            landing_page_visits = 0
            third_party_subs = 0
            widget_i10s_count_this_month = 0
            widget_i10s_count_last_month = 0
            widget_i10s_count_total = 0

            # Initilize to add count for multiple accounts
            leads_count_this_month = 0
            leads_count_last_month = 0
            leads_count_total = 0
            phone_nums_count_this_month = 0
            phone_nums_count_last_month = 0
            phone_nums_count_total = 0
            web_form_subs_count_this_month = 0
            web_form_subs_count_last_month = 0
            web_form_subs_count_total = 0
            call_seconds_this_month = 0
            call_seconds_last_month = 0
            call_seconds_total = 0
            text_msgs_this_month = 0
            text_msgs_last_month = 0
            text_msgs_total = 0

            users_count_this_month = User.get_by_partnership_datetime_expr(
                partnership.id, count_only=True, date_range_expr='this_month')
            users_count_last_month = User.get_by_partnership_datetime_expr(
                partnership.id, count_only=True, date_range_expr='last_month')
            users_count_total = User.get_by_partnership_datetime_expr(partnership.id, count_only=True)

            issues_count_this_month = Issue.get_by_partnership_datetime_expr(
                partnership.id, count_only=True, date_range_expr='this_month')
            issues_count_last_month = Issue.get_by_partnership_datetime_expr(
                partnership.id, count_only=True, date_range_expr='last_month')
            issues_count_total = Issue.get_by_partnership_datetime_expr(partnership.id, count_only=True)

            for ac in accounts:
                leads_count_this_month += get_by_partnership_account_expr(
                    Contact, ac.id, count_only=True, date_range_expr='this_month')
                leads_count_last_month += get_by_partnership_account_expr(
                    Contact, ac.id, count_only=True, date_range_expr='last_month')
                leads_count_total += get_by_partnership_account_expr(Contact, ac.id, count_only=True)

                phone_nums_count_this_month += get_by_partnership_account_expr(
                    Phone, ac.id, count_only=True, date_range_expr='this_month')
                phone_nums_count_last_month += get_by_partnership_account_expr(
                    Phone, ac.id, count_only=True, date_range_expr='last_month')
                phone_nums_count_total += get_by_partnership_account_expr(Phone, ac.id, count_only=True)

                web_form_subs_count_this_month += get_by_partnership_account_expr(
                    FormLead, ac.id, count_only=True, date_range_expr='this_month')
                web_form_subs_count_last_month += get_by_partnership_account_expr(
                    FormLead, ac.id, count_only=True, date_range_expr='last_month')
                web_form_subs_count_total += get_by_partnership_account_expr(FormLead, ac.id, count_only=True)

                text_msgs_this_month += get_by_partnership_account_expr(
                    Message, ac.id, count_only=True, date_range_expr='this_month')
                text_msgs_last_month += get_by_partnership_account_expr(
                    Message, ac.id, count_only=True, date_range_expr='last_month')
                text_msgs_total += get_by_partnership_account_expr(Message, ac.id, count_only=True)

                leads_this_month = get_by_partnership_account_expr(Lead, ac.id, date_range_expr='this_month')
                for lead1 in leads_this_month:
                    if lead1.duration:
                        call_seconds_this_month += lead1.duration

                leads_last_month = get_by_partnership_account_expr(Lead, ac.id, date_range_expr='last_month')
                for lead2 in leads_last_month:
                    if lead2.duration:
                        call_seconds_last_month += lead2.duration

                leads_total = get_by_partnership_account_expr(Lead, ac.id)
                for leadt in leads_total:
                    if leadt.duration:
                        call_seconds_total += leadt.duration

            call_minutes_this_month = int(math.ceil(call_seconds_this_month / 60))
            call_minutes_last_month = int(math.ceil(call_seconds_last_month / 60))
            call_minutes_total = int(math.ceil(call_seconds_total / 60))

            data['usage'] = [
                {
                    'label': "Leads",
                    'currentMonthTotal': leads_count_this_month,
                    'lastMonthTotal': leads_count_last_month,
                    'total': leads_count_total,
                },
                {
                    'label': "Accounts",
                    'currentMonthTotal': 0,
                    'lastMonthTotal': 0,
                    'total': len(accounts),
                },
                {
                    'label': "Users",
                    'currentMonthTotal': users_count_this_month,
                    'lastMonthTotal': users_count_last_month,
                    'total': users_count_total,
                },
                {
                    'label': "Campaigns",
                    'currentMonthTotal': 0,
                    'lastMonthTotal': 0,
                    'total': campaigns,
                },
                {
                    'label': "SupportTickets",
                    'currentMonthTotal': issues_count_this_month,
                    'lastMonthTotal': issues_count_last_month,
                    'total': issues_count_total,
                },
                {
                    'label': "PhoneNumbers",
                    'currentMonthTotal': phone_nums_count_this_month,
                    'lastMonthTotal': phone_nums_count_last_month,
                    'total': phone_nums_count_total,
                },
                {
                    'label': "WidgetInteractions",
                    'currentMonthTotal': widget_i10s_count_this_month,
                    'lastMonthTotal': widget_i10s_count_last_month,
                    'total': widget_i10s_count_total,
                },
                {
                    'label': "WebFormSubmissions",
                    'currentMonthTotal': web_form_subs_count_this_month,
                    'lastMonthTotal': web_form_subs_count_last_month,
                    'total': web_form_subs_count_total,
                },
                {
                    'label': "LandingPageVisitors",
                    'currentMonthTotal': 0,
                    'lastMonthTotal': 0,
                    'total': landing_page_visits,
                },
                {
                    'label': "CallMinutes",
                    'currentMonthTotal': call_minutes_this_month,
                    'lastMonthTotal': call_minutes_last_month,
                    'total': call_minutes_total,
                },
                {
                    'label': "TextMessages",
                    'currentMonthTotal': text_msgs_this_month,
                    'lastMonthTotal': text_msgs_last_month,
                    'total': text_msgs_total,
                },
                {
                    'label': "ThirdPartySubmissions",
                    'currentMonthTotal': 0,
                    'lastMonthTotal': 0,
                    'total': third_party_subs,
                },

            ]

    except Exception as e:
        print('Error =========== : ', e)
        status_code = 500
        success = False
        message = f"Partnership Fetching Failed!"
        data = []

    response = api_jsonify(status_code=status_code,
                           success=success,
                           message=message,
                           data=data
                           )
    return response


@role_required('partner', 'sysadmin')
def get_partnership_users():
    try:
        success = True
        message = "Users fetched successfully!"
        status_code = 200
        data = []

        partnership = Partnership.query \
            .filter(Partnership.id == current_user.partnership_id).first()
        if not partnership:
            partnership = Partnership.query.get(1)
        for u in partnership.users:
            if u.firstname and u.email:
                _user = {'value': u.sid, 'label': f'{u.firstname} {u.lastname}'}
                data.append(_user)

    except Exception as e:
        status_code = 500
        success = False
        message = f"Users fetching failed!"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@role_required('partner', 'sysadmin')
def partnership_notify_users():
    try:
        if request.method == 'POST':
            success = True
            message = "Notification Users updated successfully!"
            status_code = 200
            data = []

            notify_data = request.get_json()
            for uid in notify_data['data']:
                user = User.query.filter(User.sid == uid).first()
                if user:
                    user.support_notification = True
                    user.save()
                else:
                    success = False
                    message = "User not found!"
        else:
            success = True
            message = "Notification Users fetched successfully!"
            status_code = 200
            data = []

            partnership = Partnership.query \
                .filter(Partnership.id == current_user.partnership_id).first()
            for u in partnership.users:
                if u.support_notification:
                    _user = {}
                    _user['firstName'] = u.firstname
                    _user['lastName'] = u.lastname
                    _user['email'] = u.email
                    _user['userId'] = u.id
                    _user['supportNotification'] = u.support_notification
                    data.append(_user)
            print(data)
    except Exception as e:
        print(e)
        status_code = 500
        success = False
        message = f"Partnership Notification users get/update Failed!"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@api_role_required('sysadmin', 'partner')
def remove_notify_user(sid):
    try:
        success = True
        message = "User notification disabled successfully!"
        status_code = 200
        data = []
        u = User.query.filter(User.sid == sid).first()
        if u:
            u.support_notification = False
            u.save()

    except Exception as e:
        print(e)
        status_code = 500
        success = False
        message = f"Partnership user notification disabling failed!"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@api_role_required('sysadmin', 'partner')
def get_accounts():
    try:
        success = True
        message = "Partnership accounts fetched successfully!"
        status_code = 200

        partnership = Partnership.query.filter(Partnership.id == current_user.partnership_id).first()
        if not partnership:
            partnership = Partnership.query.get(1)

        accounts = []
        for pa in partnership.partnership_accounts:
            _account = {'sid': pa.sid, 'account_name': pa.name, 'partnerId': partnership.sid,
                        'partnershipName': partnership.name, 'active': pa.active, 'email': pa.email,
                        'created_on': pa.created_on, 'updated_on': pa.updated_on, 'business_type': pa.business_type,
                        'billing_type': pa.billing_type}
            accounts.append(_account)

        data = accounts

    except Exception as e:
        status_code = 500
        success = False
        message = f"Partnership accounts fetching failed!"
        data = []

    response = jsonify({
        "statusCode": status_code,
        "success": success,
        "message": message,
        "data": data
    })
    return response


@api_role_required('partner')
def create_account():
    try:
        success = True
        message = "Partnership account created successfully!"
        status_code = 200
        data = {}
        account = None

        partnership = Partnership.query.filter(Partnership.id == current_user.partnership_id).first()
        if not partnership:
            partnership = Partnership.query.get(1)

        account_data = request.get_json()
        pa_name = account_data.get('name', None)
        description = account_data.get('description', "")
        safety_information = account_data.get('safety_information', "")
        address_1 = account_data.get('address_1', "")
        address_2 = account_data.get('address_2', "")
        city = account_data.get('city', "")
        state = account_data.get('state', "")
        zip_code = account_data.get('zip_code', "")
        country = account_data.get('country', 'united states')
        timezone = account_data.get('timezone', 'US/Eastern')
        email = account_data.get('email', "")
        active = account_data.get('active', False)
        billing_type = account_data.get('billing_type', None)
        business_type = account_data.get('business_type', None)
        is_all_hours = account_data.get('all_hours', False)
        general_schedule_data = account_data.get('generalScheduleData', {})
        service_schedule_data = account_data.get('serviceScheduleData', {})

        if pa_name and billing_type and email and business_type:
            test_server_domain = current_app.config.get('TEST_SERVER_DOMAIN', None)
            if test_server_domain and current_app.config.get('DEBUG', False):
                domain = test_server_domain
            else:
                domain = partnership.partner_url
            email_address = email + '@' + domain
            account = PartnershipAccount.create(name=pa_name,
                                                description=description,
                                                safety_information=safety_information,
                                                address_1=address_1,
                                                address_2=address_2,
                                                city=city,
                                                state=state,
                                                zip_code=zip_code,
                                                country=country,
                                                timezone=timezone,
                                                partnership_id=partnership.id,
                                                active=active,
                                                billing_type=billing_type,
                                                business_type=business_type,
                                                email=email_address,
                                                all_hours=is_all_hours,
                                                account_invitation_url_token=str(uuid.uuid4()))
            if general_schedule_data and account:
                general_is_all_hours = general_schedule_data.get('allHours', False)
                days = []
                for gidx, ghours in enumerate(general_schedule_data.get('availableHours', {})):
                    days.append({
                        'day': gidx,
                        'available_from': ghours.get('start', '08:00 AM'),
                        'available_to': ghours.get('stop', '05:00 PM'),
                        'is_active': ghours.get('is_active', False),
                        'partnership_account_id': account.id,
                        'operating_type': 'general',
                        'is_all_hours': general_is_all_hours
                    })
                day_result = PartnershipAccountOperatingHours.create(*days)

            if service_schedule_data and account:
                service_is_all_hours = service_schedule_data.get('allHours', False)
                days = []
                for sidx, shours in enumerate(service_schedule_data.get('availableHours', {})):
                    days.append({
                        'day': sidx,
                        'available_from': shours.get('start', '08:00 AM'),
                        'available_to': shours.get('stop', '05:00 PM'),
                        'is_active': shours.get('is_active', False),
                        'partnership_account_id': account.id,
                        'operating_type': 'service',
                        'is_all_hours': service_is_all_hours
                    })
                day_result = PartnershipAccountOperatingHours.create(*days)

            email_add_resp = ses_client.verify_email_identity(email_address)

            es_data = {
                'user_id': current_user.sid,
                'notify_message_type': 'PARTNERSHIP_ACCOUNT_CREATED',
                'user_related_entities': "You've",
                'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
                'hyperlink': f'{partnership.partner_url}/dashboard'
            }
            es_response = send_notifications(**es_data)

        if not account:
            status_code = 404
            success = False
            message = "Missing parameters"

    except Exception as e:
        print(e)
        status_code = 500
        success = False
        message = f"Partnership account creating failed!"
        data = []
    return api_jsonify(data, status_code, message, success)


# @api_role_required('partner')
def update_account(paid):
    message = "Partnership account updated successfully!"
    partnership_account = PartnershipAccount.get_by_sid(paid)

    if not partnership_account:
        status_code = 404
        success = False
        message = "Invalid partnership account ID."
        return api_jsonify(status_code=status_code, success=success, message=message)

    partnership = Partnership.get_by_id(partnership_account.partnership_id)
    account_data = request.get_json()
    general_schedule_data = account_data.get('generalScheduleData', {})
    service_schedule_data = account_data.get('serviceScheduleData', {})

    params = {
        "name": account_data.get('name', None),
        "description": account_data.get('description', ""),
        "safety_information": account_data.get('safety_information', ""),
        "address_1": account_data.get('address_1', ""),
        "address_2": account_data.get('address_2', ""),
        "city": account_data.get('city', ""),
        "state": account_data.get('state', ""),
        "zip_code": account_data.get('zip_code', ""),
        "country": account_data.get('country', 'united states'),
        "timezone": account_data.get('timezone', 'US/Eastern'),
        "active": account_data.get('active', partnership_account.active),
        "billing_type": account_data.get('billing_type', None),
        "business_type": account_data.get('business_type', None),
        "all_hours": account_data.get('all_hours', False)
    }

    for k, v in params.items():
        if k in account_data:
            setattr(partnership_account, k, v)
    partnership_account.save()

    if general_schedule_data:
        general_is_all_hours = general_schedule_data.get('allHours', False)
        existing_operating_hours = PartnershipAccountOperatingHours.get_by_account_id(partnership_account.id)
        if existing_operating_hours:
            for hours in general_schedule_data.get('availableHours', []):
                if hours.get('schedule_id', None):
                    day = {
                        'operating_id': hours.get('schedule_id'),
                        'available_from': hours.get('start', '08:00 AM'),
                        'available_to': hours.get('stop', '05:00 PM'),
                        'is_active': hours.get('is_active', False),
                        'is_all_hours': general_is_all_hours
                    }
                    day_result = PartnershipAccountOperatingHours.update(**day)
        else:
            days = []
            for hours in general_schedule_data.get('availableHours', []):
                days.append({
                    'day': hours.get('day_id', 0),
                    'available_from': hours.get('start', '08:00 AM'),
                    'available_to': hours.get('stop', '05:00 PM'),
                    'is_active': hours.get('is_active', False),
                    'partnership_account_id': partnership_account.id,
                    'operating_type': 'general',
                    'is_all_hours': general_is_all_hours
                })
            day_result = PartnershipAccountOperatingHours.create(*days)

    if service_schedule_data:
        service_is_all_hours = service_schedule_data.get('allHours', False)
        existing_operating_hours = PartnershipAccountOperatingHours.get_by_account_id(partnership_account.id)
        if existing_operating_hours:
            for hours in service_schedule_data.get('availableHours', []):
                if hours.get('schedule_id', None):
                    day = {
                        'operating_id': hours.get('schedule_id'),
                        'available_from': hours.get('start', '08:00 AM'),
                        'available_to': hours.get('stop', '05:00 PM'),
                        'is_active': hours.get('is_active', False),
                        'is_all_hours': service_is_all_hours
                    }
                    day_result = PartnershipAccountOperatingHours.update(**day)
        else:
            days = []
            for hours in service_schedule_data.get('availableHours', []):
                days.append({
                    'day': hours.get('day_id', 0),
                    'available_from': hours.get('start', '08:00 AM'),
                    'available_to': hours.get('stop', '05:00 PM'),
                    'is_active': hours.get('is_active', False),
                    'partnership_account_id': partnership_account.id,
                    'operating_type': 'service',
                    'is_all_hours': service_is_all_hours
                })
            day_result = PartnershipAccountOperatingHours.create(*days)

    es_data = {
        'user_id': current_user.sid,
        'notify_message_type': 'PARTNERSHIP_ACCOUNT_UPDATED',
        'user_related_entities': "You've",
        'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
        'hyperlink': f'{partnership.partner_url}/dashboard'
    }
    es_response = send_notifications(**es_data)

    return api_jsonify(message=message)


@api_role_required('partner')
def get_account_by_sid(sid):
    try:
        success = True
        message = "Partnership account created successfully!"
        status_code = 200
        data = {}

        if sid:
            pa_account = PartnershipAccount.get_by_sid(sid)
            if pa_account:
                data = PartnershipAccountOutSchema().dump(pa_account)
                general_schedule = PartnershipAccountOperatingHours.get_general_by_account(pa_account.id)
                service_schedule = PartnershipAccountOperatingHours.get_service_by_account(pa_account.id)
                available_all_hours = all([hour.is_all_hours for hour in general_schedule])
                service_available_all_hours = all([hour.is_all_hours for hour in service_schedule])
                data['generalScheduleData'] = {
                    'allHours': available_all_hours,
                    'availableHours': PartnershipAccountOperatingHoursOutSchema(many=True).dump(
                        general_schedule) if general_schedule else []
                }
                data['serviceScheduleData'] = {
                    'allHours': service_available_all_hours,
                    'availableHours': PartnershipAccountOperatingHoursOutSchema(many=True).dump(
                        service_schedule) if service_schedule else []
                }
            else:
                success = False
                message = "Partnership account not found!"
                status_code = 404
        else:
            success = False
            message = "Partnership account id missing!"
            status_code = 404
    except Exception as e:
        print(e)
        status_code = 500
        success = False
        message = f"Partnership account fetching failed!"
        data = []

    return api_jsonify(data=data, success=success, status_code=status_code, message=message)


@login_required
def check_email_availability():
    success = True
    message = "Email is available!"
    status_code = 200
    data = {}
    received = request.get_json()
    partnership_id = received.get('partnership_id', None)
    email = received.get('email', None)
    if partnership_id and email:
        email_in_pa, email_in_p = PartnershipAccount.query.filter(PartnershipAccount.partnership_id == partnership_id,
                                                                  PartnershipAccount.email == email), Partnership.query.filter(
            Partnership.email_sender == email)
        custom_email = EmailIdentity.query.filter(EmailIdentity.email == email).first()
        if email_in_pa or email_in_p or custom_email:
            success = False
            message = "Email already exists!"
            status_code = 409
    else:
        success = False
        message = "Invalid data!"
        status_code = 400

    return api_jsonify(data, status_code, message, success)