diff --git a/app/main.py b/app/main.py index 0030a54..182658b 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from app.lib_general import log, logging from app.log import log # Import the routers here first: -from app.routers import api_crud, api, importing, account, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_group_person, membership_person, membership_person_profile, membership_type, membership_type_person, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals +from app.routers import api_crud, api, importing, account, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_group_person, membership_person, membership_person_profile, membership_type, membership_type_person, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets#, e_impexium from app.db_sql import db @@ -289,6 +289,12 @@ app.include_router( #responses={404: {'description': 'Not found'}}, ) +# app.include_router( +# e_impexium.router, +# prefix='/e/impexium', +# tags=['External Service: Impexium'], +# ) + # BEGIN: CORS origins = [ diff --git a/app/methods/e_impexium_methods.py b/app/methods/e_impexium_methods.py new file mode 100644 index 0000000..ad49358 --- /dev/null +++ b/app/methods/e_impexium_methods.py @@ -0,0 +1,319 @@ +from __future__ import annotations +import datetime, pprint, random, requests + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator + +from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update +from app.lib_general import log, logging + +headers = { 'Content-Type': 'application/json;charset=UTF-8' } + +app = {} +app['user_email'] = 'oneskyit_integration@oneskyit.com' +app['user_password'] = 'dAPpHDE6d5vLHjsk' + +app['name'] = 'IshltOneSkyITLIVE' +app['key'] = '98yp4fa57mJX6nU4' +app['id'] = 'IshltOneSkyITLIVE' +app['password'] = '98yp4fa57mJX6nU4' +print('App data', app) + +api = {} +api['base_url'] = 'https://public.impexium.com/Api/v1' # or https://ishlt.mpxapi.com:443/api/v1 ?? +api['headers'] = { 'Content-Type': 'application/json;charset=UTF-8' } + + +def get_access_token(api, app): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Web API End Point and Access Token ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = '/WebApiUrl' + uri = api['base_url']+endpoint + + data = { 'AppName': app['name'], 'AppKey': app['key'] } + + r = requests.post(url=uri, json=data, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + api['access_token'] = response_data['accessToken'] + api['headers']['AccessToken'] = response_data['accessToken'] + api['auth_uri'] = response_data['uri'] + + return api + + +def authenticate(api, app): + print('***** **** *** ** * ** *** **** *****') + print('*** Authenticate App, and get app token and user token (SSO Token) ***') + print('***** **** *** ** * ** *** **** *****') + + data = { 'AppId': app['id'], 'AppPassword': app['password'], 'AppUserEmail': app['user_email'], 'AppUserPassword': app['user_password'] } + + r = requests.post(url=api['auth_uri'], json=data, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + api['headers']['AppToken'] = response_data['appToken'] + api['headers']['UserToken'] = response_data['userToken'] + api['base_url'] = response_data['uri'] + + # app['user_id'] = response_data['userId'] + # app['sso_token'] = response_data['ssoToken'] + # app['app_configuration'] = response_data['appConfiguration'] # allowGoogleLogin=False, allowLinkedInLogin=False + + return api + + +api = get_access_token(api=api, app=app) +log.debug(api) + +api = authenticate(api=api, app=app) +log.debug(api) + + +def get_custom_fields(api, name=None, page=1): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Custom Fields ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Setup/customfields/{page}' + uri = api['base_url']+endpoint + + print('Endpoint URI', uri) + + params = {} + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + custom_field_li = response_data + + return custom_field_li + + +def get_events(page=1): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Events ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Events/All/{page}' + uri = api['base_url']+endpoint + + print('Endpoint URI', uri) + + params = {} + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + event_li = response_data + + return event_li + + +def get_event_registrants( + event_code: str, + page: int = 1, + return_all: bool = False + ): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Event Registrants ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Events/{event_code}/Registrations/{page}' + uri = api['base_url']+endpoint + + params = {} + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + # print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print(response_data) + # print('**************************') + + event_registrant_li = response_data + if return_all: + return event_registrant_li + else: + return event_registrant_li['dataList'] + + +def get_individual_registrations(api, record_number, event_code=None, page=1): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Individual Registrations ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Individuals/{record_number}/Registrations/{page}' + uri = api['base_url']+endpoint + + params = { 'eventCode': event_code } + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + # print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + individual_registraion_li = response_data + + return individual_registraion_li + + +def get_individual_purchases(api, record_number, product_code=None, purchased_since=None, product_category_code=None, page=1): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Individual Purchases ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Individuals/{record_number}/Purchases/{page}' + uri = api['base_url']+endpoint + + params = { 'productCode': product_code, 'purchasedSince': purchased_since, 'productCategoryCode': product_category_code } + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + individual_purchase_li = response_data + + return individual_purchase_li + + +def get_individual_custom_fields(api, individual_id): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Individual Custom Fields ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Individuals/{individual_id}/CustomFields' + uri = api['base_url']+endpoint + + params = { } + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + # print('Headers:', r.headers) + # print('Encoding:', r.encoding) + # print('JSON:', r.json()) + # print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + individual_custom_field_li = response_data + + return individual_custom_field_li + + +def get_individual_orders_open(api, record_number, include_line_items=False, from_date=None, to_date=None, page=1): + print('***** **** *** ** * ** *** **** *****') + print('*** Get Individual Orders Open ***') + print('***** **** *** ** * ** *** **** *****') + + endpoint = f'/Individuals/{record_number}/Orders/Open/{page}' + uri = api['base_url']+endpoint + print(uri) + + params = { 'includeLineItems': include_line_items, 'fromDate': from_date, 'toDate': to_date } + + r = requests.get(url=uri, params=params, headers=api['headers']) + + print('**************************') + print('Status Code:', r.status_code) + print('Headers:', r.headers) + # print('Encoding:', r.encoding) + print('JSON:', r.json()) + print('Text:', r.text) + print('**************************') + + response_data = r.json() + + # pp = pprint.PrettyPrinter(indent=2) + # pp.pprint(response_data) + # print('**************************') + + individual_orders_open_li = response_data + + return individual_orders_open_li diff --git a/app/routers/account.py b/app/routers/account.py index 631ba3e..8bcfb80 100644 --- a/app/routers/account.py +++ b/app/routers/account.py @@ -149,7 +149,7 @@ async def get_account_obj_li( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=response_data) + return mk_resp(data=response_data, response=response) # ### BEGIN ### API Account ### get_account_obj_new() ### @@ -238,7 +238,7 @@ async def get_account_obj_new( log.debug(locals()) if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass - else: return mk_resp(data=None, status_code=404) + else: return mk_resp(data=None, status_code=404, response=response) if account_result := load_account_obj( account_id = account_id, @@ -329,7 +329,7 @@ async def get_account_obj_new( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=response_data) + return mk_resp(data=response_data, response=response) # ### END ### API Account ### get_account_obj_new() ### @@ -352,29 +352,40 @@ async def delete_account_obj( @router.get('/{account_id}/cfg', response_model=Resp_Body_Base) async def get_account_cfg_obj( - account_id: str = Query(..., min_length=1, max_length=22), + account_id: str = Query(..., min_length=11, max_length=22), sys_module: Optional[str] = None, # event, fundraising, membership x_account_id: str = Header(...), by_alias: Optional[bool] = True, exclude_unset: Optional[bool] = True, response: Response = Response, ): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) + # print(x_account_id) + + if account_id := redis_lookup_id_random(record_id_random=x_account_id, table_name='account'): pass + else: return mk_resp(data=None, status_code=404, status_message=f'The Account ID was not found. Account ID: {account_id}', response=response) + if sys_module: if sys_module == 'membership': membership_cfg_obj = load_account_cfg_obj(account_id=account_id, inc_membership_cfg=True).dict(by_alias=by_alias, exclude_unset=exclude_unset) data = membership_cfg_obj - return mk_resp(data=data) + return mk_resp(data=data, response=response) else: - obj_type = 'account_cfg' - result = get_obj_template( - obj_type=obj_type, - obj_id=account_id, - by_alias=True, - exclude_unset=True, - ) - #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(result) - return result + if account_cfg_obj := load_account_cfg_obj(account_id=account_id).dict(by_alias=by_alias, exclude_unset=exclude_unset): + data = account_cfg_obj + return mk_resp(data=data, response=response) + else: + return mk_resp(data=False, status_code=404, response=response) + + # obj_type = 'account_cfg' + # result = get_obj_template( + # obj_type=obj_type, + # obj_id=account_id, + # by_alias=True, + # exclude_unset=True, + # ) + # #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + # log.debug(result) + # return result diff --git a/app/routers/e_impexium.py b/app/routers/e_impexium.py new file mode 100644 index 0000000..10442e5 --- /dev/null +++ b/app/routers/e_impexium.py @@ -0,0 +1,342 @@ +import datetime, json, pytz, secrets, time +import pandas, xlrd # qrcode +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from app.lib_general import log, logging, secure_hash_string +from app.config import settings +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random + +from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template + +from app.methods.e_impexium_methods import get_custom_fields, get_events, get_event_registrants + +from app.models.event_badge_models import Event_Badge_Base +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +# Updated 2021-10-07 +@router.get('/event/{e_impexium_event_id}/import_reg', response_model=Resp_Body_Base) +async def event_import_reg( + e_impexium_event_id: str = Query(..., min_length=11, max_length=22), # For ISHLT: 41V_2 (2021-04) + page: int = 1, # 250 per page from Impexium + event_id: str = Query(..., min_length=11, max_length=22), # For ISHLT: ZDzTBlevhZs (2022-04) + x_account_id: str = Header(...), # For ISHLT: d8TqXqf1EOg + response: Response = Response, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + log.info('Starting Impexium event registration import...') + + if account_id := redis_lookup_id_random(record_id_random=x_account_id, table_name='account'): pass + else: return mk_resp(data=None, status_code=404, status_message=f'The Account ID was not found. Account ID: {account_id}', response=response) + + if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass + else: return mk_resp(data=None, status_code=404, status_message=f'The Event ID was not found. Event ID: {event_id}', response=response) + + event_registrant_li = get_event_registrants(event_code=e_impexium_event_id, page=page) + log.debug(type(event_registrant_li)) + + event_badge_li = [] + for event_registrant in event_registrant_li: + log.info(f"Record Num: {event_registrant.get('recordNumber')}, Registration Num: {event_registrant.get('registrationNumber')}, Registrant Type Code: {event_registrant.get('registrantTypeCode')}") + log.debug(event_registrant) + + event_badge_data = {} + # event_badge_data['account_id'] = account_id + event_badge_data['event_id'] = event_id + # Creating an external ID from the Impexium record number and registration number. Very explicitly converting each number to a string before joining, just in case. + external_id = str(event_registrant.get('recordNumber'))+':'+str(event_registrant.get('registrationNumber')) + event_badge_data['external_id'] = external_id + + sql_select_event_badge = f""" + SELECT id AS event_badge_id, id_random AS event_badge_id_random, external_id AS event_badge_external_id + FROM `event_badge` AS `event_badge` + WHERE event_badge.event_id = :event_id + AND event_badge.external_id = :external_id + /*LIMIT 1*/; + """ + + if event_badge_result := sql_select(sql=sql_select_event_badge, data=event_badge_data): + log.info('Found Event Badge') + if isinstance(event_badge_result, list): + log.error(f'Found more than one Event Badge with the same External ID. Count: {len(event_badge_result)}') + break + return False + else: + log.info('Update record?') + else: + log.info('No Event Badge found') + log.info('Insert record') + + event_badge_data['badge_type_code'] = event_registrant.get('registrantTypeCode') # Using this as the badge_type + event_badge_data['badge_type'] = event_registrant.get('registrantTypeName') + event_badge_data['member_type_code'] = event_registrant.get('customerType') # Using this as the member_type + event_badge_data['registration_type_code'] = event_registrant.get('registrantTypeCode') + event_badge_data['registration_type'] = event_registrant.get('registrantTypeName') + + event_badge_data['pronouns'] = event_registrant.get('gender') + + event_badge_data['informal_name'] = event_registrant.get('preferredFirstName') + event_badge_data['title_names'] = event_registrant.get('prefix') + event_badge_data['given_name'] = event_registrant.get('firstName') + event_badge_data['middle_name'] = event_registrant.get('middleName') + event_badge_data['family_name'] = event_registrant.get('lastName') + + event_badge_data['designations'] = event_registrant.get('suffix') + + event_badge_data['professional_title'] = event_registrant.get('title') + + event_badge_data['display_name'] = event_registrant.get('badgeName') + + event_badge_data['affiliations'] = event_registrant.get('badgeOrganization') + + event_badge_data['city'] = event_registrant.get('badgeCity') + event_badge_data['state_province'] = event_registrant.get('badgeState') + + if event_badge_obj_in_result := sql_insert(data=event_badge_data, table_name='event_badge', rm_id_random=True, id_random_length=8): + event_badge_id = event_badge_obj_in_result + # event_badge_id = event_badge_obj.get('id') # event_badge_id_random + log.info('Event Badge added. Event Badge ID: {event_badge_id}') + event_badge_data['event_badge_id'] = event_badge_id + else: + log.warning(f'Event Badge not created.') + log.debug(event_badge_obj_in_result) + break + return False + + + # event_badge_data = {} + # external_id = event_registrant.get('recordNumber')+':'+event_registrant.get('registrationNumber') + # event_badge_data['external_id'] = external_id + # # event_badge_data['reg_num'] = event_registrant.get('registrationNumber') + # event_badge_data['badge_type_code'] = event_registrant.get('registrantTypeCode') # Using this as the badge_type + # event_badge_data['badge_type'] = event_registrant.get('registrantTypeName') + # event_badge_data['member_type_code'] = event_registrant.get('customerType') # Using this as the member_type + # event_badge_data['registration_type_code'] = event_registrant.get('registrantTypeCode') + # event_badge_data['registration_type'] = event_registrant.get('registrantTypeName') + + # event_badge_data['pronouns'] = event_registrant.get('gender') + + # event_badge_data['informal_name'] = event_registrant.get('preferredFirstName') + # event_badge_data['title_names'] = event_registrant.get('prefix') + # event_badge_data['given_name'] = event_registrant.get('firstName') + # event_badge_data['middle_name'] = event_registrant.get('middleName') + # event_badge_data['family_name'] = event_registrant.get('lastName') + # # event_badge_data['not_sure'] = event_registrant.get('secondLastName') + + # event_badge_data['designations'] = event_registrant.get('suffix') + + # event_badge_data['professional_title'] = event_registrant.get('title') + + # event_badge_data['display_name'] = event_registrant.get('badgeName') + + # event_badge_data['affiliations'] = event_registrant.get('badgeOrganization') + + # event_badge_data['city'] = event_registrant.get('badgeCity') + # event_badge_data['state_province'] = event_registrant.get('badgeState') + + # id, attendedDate, sessions, itemizedCustomFields, guestOfRecordNumber, registrantTypeName, boughtTogetherWith, primaryOrganization, customerType, showInDirectory, addresses, emails, phones + + event_badge_li.append(event_badge_data) + + return mk_resp(data=event_badge_li, response=response) + + for record in df_dict: + membership_new = None + person_id = None + contact_id = None + address_id = None + user_id = None + # person_profile_id = None + membership_person_id = None + membership_type_person_id = None + + person_data = {} + person_data['account_id'] = account_id + + if record['external_id']: # This is now required for the membership portion 2021-10-04 + external_id = record['external_id'] + else: continue # external_id = None + log.info(f'External ID: {external_id}') + + if record['external_import_id']: + person_data['external_import_id'] = record['external_import_id'] + else: + person_data['external_import_id'] = record['email'] + external_import_id = person_data['external_import_id'] + + if membership_type_name := record.get('membership_type', None): pass + else: continue + + data = {} + data['account_id'] = account_id + data['external_id'] = external_id + data['external_import_id'] = external_import_id + sql = f""" + SELECT * + FROM `v_person` AS `person` + WHERE person.account_id = :account_id + AND person.external_id = :external_id + LIMIT 1; + """ + # sql = f""" + # SELECT * + # FROM `v_person` AS `person` + # WHERE person.account_id = :account_id + # AND person.external_import_id = :external_import_id + # ORDER BY `person`.created_on DESC, `person`.updated_on DESC + # LIMIT 1; + # """ + if person_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs of existing person record + log.debug('Found one record') + person_rec = person_rec_result + person_id = person_rec.get('person_id', None) + contact_id = person_rec.get('contact_id', None) + address_id = person_rec.get('address_id', None) + user_id = person_rec.get('user_id', None) + membership_person_id = person_rec.get('membership_person_id', None) + log.info(f'Found membership_person_id: {membership_person_id}') + else: + continue + + membership_person_data = {} + membership_type_person_data = {} + + + # datetime.datetime.strptime(date_time_str, '%m/%d/%Y') + + membership_person_data['first_approved_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + # membership_type_person_data['first_approved_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + membership_person_data['first_start_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + membership_type_person_data['first_start_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + + if membership_last_renewal_date := record.get('membership_last_renewal_date', None): + membership_person_data['start_on'] = datetime.datetime.strptime(membership_last_renewal_date, '%m/%d/%Y') + membership_type_person_data['start_on'] = datetime.datetime.strptime(membership_last_renewal_date, '%m/%d/%Y') + else: + membership_person_data['start_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + membership_type_person_data['start_on'] = datetime.datetime.strptime(record.get('membership_join_date', None), '%m/%d/%Y') + membership_person_data['end_on'] = datetime.datetime.strptime(record.get('membership_expiration_date', None), '%m/%d/%Y') + membership_type_person_data['end_on'] = datetime.datetime.strptime(record.get('membership_expiration_date', None), '%m/%d/%Y') + membership_person_data['last_end_on'] = datetime.datetime.strptime(record.get('membership_expiration_date', None), '%m/%d/%Y') + membership_type_person_data['last_end_on'] = datetime.datetime.strptime(record.get('membership_expiration_date', None), '%m/%d/%Y') + + current_datetime = datetime.datetime.now() + if membership_person_data['end_on'] >= current_datetime: + membership_person_data['lu_membership_person_status_id'] = 5 # 5 = active; expiration is > now + membership_type_person_data['lu_membership_type_status_id'] = 5 # 5 = active; expiration is > now + else: + membership_person_data['lu_membership_person_status_id'] = 7 # 7 = inactive; expiration is < now + membership_type_person_data['lu_membership_type_status_id'] = 7 # 7 = inactive; expiration is > now + + + # membership_type_person_data['membership_person_id'] = membership_person_id + if membership_type_name == 'Al-Anon Member': + membership_type_person_data['membership_type_id'] = 6 + membership_type_person_data['product_id'] = 13 + membership_person_data['level'] = 1 + membership_type_person_data['level'] = 1 + elif membership_type_name == 'Annual Contribution': # Unsure... making affiliate + membership_type_person_data['membership_type_id'] = 8 + membership_type_person_data['product_id'] = 13 + membership_person_data['level'] = 3 + membership_type_person_data['level'] = 3 + elif membership_type_name == 'Doctoral Qualifying Member': + membership_type_person_data['membership_type_id'] = 5 + membership_type_person_data['product_id'] = 4 + membership_person_data['level'] = 1 + membership_type_person_data['level'] = 1 + elif membership_type_name == 'Student Member': + membership_type_person_data['membership_type_id'] = 7 + membership_type_person_data['product_id'] = 14 + membership_person_data['level'] = 1 + membership_type_person_data['level'] = 1 + + if membership_person_id: # Update the membership records + membership_person_data['id'] = membership_person_id + # sql_update() # UPDATE membership_person + log.info('UPDATE membership_person...') + if membership_person_obj_up_result := sql_update(data=membership_person_data, table_name='membership_person'): + log.debug(membership_person_obj_up_result) + else: + log.warning(membership_person_obj_up_result) + # continue # Something unexpected may have happened + + # sql_update() # UPDATE membership_type_person + log.info('UPDATE membership_type_person...') + data = {} + data['membership_person_id'] = membership_person_id + sql = f""" + SELECT * + FROM `v_membership_person` AS `membership_person` + WHERE membership_person.id = :membership_person_id + LIMIT 1; + """ + if membership_person_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs of existing person record + log.debug('Found one record') + membership_person_rec = membership_person_rec_result + membership_type_person_id = membership_person_rec.get('membership_type_person_id', None) + log.info(f'Found membership_type_person_id: {membership_type_person_id}') + else: + continue + membership_type_person_data['id'] = membership_type_person_id + if membership_type_person_obj_up_result := sql_update(data=membership_type_person_data, table_name='membership_type_person'): + log.debug(membership_type_person_obj_up_result) + else: + log.warning(membership_type_person_obj_up_result) + continue # Something unexpected may have happened + else: # Create new membership records + membership_person_data['account_id'] = account_id + membership_person_data['person_id'] = person_id + membership_person_data['user_id'] = user_id + + # sql_insert() # INSERT new membership_person + log.info('INSERT new membership_person...') + if membership_person_obj_in_result := sql_insert(data=membership_person_data, table_name='membership_person'): + log.debug(membership_person_obj_in_result) + membership_person_id = membership_person_obj_in_result # Should be an int + membership_person_new = True # Need to UPDATE this record after the membership type person data is processed + else: + log.warning(membership_person_obj_in_result) + # continue # Something unexpected may have happened + + # sql_insert() # INSERT new membership_type_person link using membership_person_id + log.info('INSERT new membership_type_person link using membership_person_id...') + membership_type_person_data['membership_person_id'] = membership_person_id + if membership_type_person_obj_in_result := sql_insert(data=membership_type_person_data, table_name='membership_type_person'): + log.debug(membership_type_person_obj_in_result) + membership_type_person_id = membership_type_person_obj_in_result # Should be an int + membership_type_person_new = True # Need to UPDATE this record after the membership type person data is processed + else: + log.warning(membership_type_person_obj_in_result) + # continue # Something unexpected may have happened + + membership_person_data['membership_type_person_id'] = membership_type_person_id + # sql_update() # UPDATE membership_person with new membership_type_person_id + log.info('UPDATE membership_person with new membership_type_person_id...') + membership_person_data['id'] = membership_person_id + if membership_person_obj_up_result := sql_update(data=membership_person_data, table_name='membership_person'): + log.debug(membership_person_obj_up_result) + else: + log.warning(membership_person_obj_up_result) + continue # Something unexpected may have happened + + person_data_min = {} + person_data_min['person_id'] = person_id + person_data_min['membership_person_id'] = membership_person_id + person_data_min['membership_type_person_id'] = membership_type_person_id + person_data_min['membership_type_name'] = membership_type_name + person_data_li.append(person_data_min) + log.debug(f"Record processed: {person_id} {record['email']}") + # log.debug('*** *** *** *** END TEST RUN *** *** *** ***') + # break + + return mk_resp(data=person_data_li)