import gc from src.backup_crm_csv_data_process import backup_crm_csv_data_process from src.backup_crm_data_process import backup_crm_data_process from src.check_object_info_process import check_object_info_process from src.config.objects import FetchTargetObjects from src.convert_crm_csv_data_process import convert_crm_csv_data_process from src.copy_crm_csv_data_process import copy_crm_csv_data_process from src.error.exceptions import MeDaCaCRMDataFetchException from src.fetch_crm_data_process import fetch_crm_data_process from src.prepare_data_fetch_process import prepare_data_fetch_process from src.set_datetime_period_process import set_datetime_period_process from src.system_var.constants import OBJECT_NAME_KEY from src.upload_last_fetch_datetime_process import \ upload_last_fetch_datetime_process from src.upload_result_data_process import upload_result_data_process from src.util.execute_datetime import ExecuteDateTime from src.util.logger import logger_instance as logger def controller() -> None: """コントロール処理""" try: # ① CRMデータ取得処理開始ログを出力する logger.info('I-CTRL-01 CRMデータ取得処理を開始します') # ② データ取得準備処理を呼び出す logger.info('I-CTRL-02 データ取得準備処理呼び出し') fetch_target_objects, execute_datetime, process_result = prepare_data_fetch_process() # ③ object_infoのobjectsキーの値の件数分ループする logger.info('I-CTRL-03 取得対象オブジェクトのループ処理開始') process_result = _fetch_crm_data(fetch_target_objects, execute_datetime, process_result) # ④ すべてのオブジェクトの処理が完了したことと、オブジェクト毎の処理結果をログに出力する logger.info(f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{process_result}]') # 最終結果が0件(1件も処理されていない)の場合、ログ出力して処理を終了する if len(process_result.keys()) == 0: logger.info('I-CTRL-21 処理対象のデータが存在しませんでした') return 0 # ⑤ 取得処理実施結果アップロード処理を呼び出す logger.info('I-CTRL-18 CRM_取得処理実施結果ファイルアップロード処理開始') upload_result_data_process(process_result, execute_datetime) # ⑥ 最終結果をチェックし、チェック結果をログに出力 _check_process_result(process_result) return 0 except MeDaCaCRMDataFetchException as e: logger.error(f'E-ERR-01 [{e.func_name}]でエラーが発生したため、処理を終了します') logger.exception(f'{e.error_id} {e}') raise e except Exception as e: logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e) raise e finally: # ⑦ CRMデータ取得処理終了ログを出力する logger.info('I-CTRL-20 CRMデータ取得処理を終了します') def _fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: ExecuteDateTime, process_result: dict): """取得対象オブジェクト情報をループし、1オブジェクトごとのデータを取得する Args: fetch_target_objects (FetchTargetObjects): CRMオブジェクト情報インスタンス execute_datetime (ExecuteDateTime): 実行日次取得インスタンス process_result (dict): 取得処理実行結果辞書オブジェクト Returns: process_result: 取得処理実行結果辞書オブジェクト """ for object_info in fetch_target_objects: try: process_result[object_info.get(OBJECT_NAME_KEY)] = 'fail' _fetch_crm_data_per_object(object_info, execute_datetime) process_result[object_info.get(OBJECT_NAME_KEY)] = 'success' except MeDaCaCRMDataFetchException as e: logger.info(f'{e.error_id} {e}') logger.info( f'I-ERR-03 [{object_info.get(OBJECT_NAME_KEY)}] の[{e.func_name}]でエラーが発生しました 次のオブジェクトの処理に移行します', exc_info=True) continue except Exception as e: logger.info( f'I-ERR-04 [{object_info.get(OBJECT_NAME_KEY)}] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します', e, exc_info=True) continue return process_result def _fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateTime) -> None: """オブジェクトごとにCRMのデータを取得し、取込フォルダにアップロードする Args: object_info (dict): 取得対象オブジェクト情報 execute_datetime (ExecuteDateTime): 実行日次取得インスタンス """ # 1. オブジェクト処理結果の初期化 logger.debug(f'D-CTRL-04 対象のオブジェクト情報を出力します オブジェクト情報:[{object_info}]') # 2. オブジェクト情報形式チェック処理を呼び出す logger.info('I-CTRL-05 オブジェクト情報形式チェック処理呼び出し') target_object = check_object_info_process(object_info, execute_datetime) target_object_name = target_object.object_name # 3. 処理対象のオブジェクト名をログ出力する logger.info( f'I-CTRL-06 [{target_object_name}]のデータ取得を開始します') # 4. オブジェクト情報.is_skipがTrueの場合、次のオブジェクトの処理に移行する if target_object.is_skip is True: logger.info( f'I-CTRL-07 [{target_object_name}]のデータ取得処理をスキップします') return # 5. データ取得期間設定処理を呼び出す logger.info( f'I-CTRL-08 [{target_object_name}]のデータ取得期間設定処理呼び出し') last_fetch_datetime = set_datetime_period_process(target_object, execute_datetime) # 6. CRMデータ取得処理を呼び出す logger.info( f'I-CTRL-09 [{target_object_name}]のデータ取得処理呼び出し') crm_data_response = fetch_crm_data_process(target_object, last_fetch_datetime) # 7. 出力ファイル名をログ出力する logger.info( f'I-CTRL-10 [{target_object_name}] の出力ファイル名は [{target_object.upload_file_name}] となります') # 8. CRM電文データバックアップ処理を呼び出す logger.info( f'I-CTRL-11 [{target_object_name}] CRM電文データバックアップ処理呼び出し') backup_crm_data_process(target_object_name, crm_data_response, execute_datetime) # 9. CSV変換処理を呼び出す logger.info( f'I-CTRL-12 [{target_object.object_name}] CSV変換処理呼び出し') csv_string = convert_crm_csv_data_process(target_object, crm_data_response) # 10. CSVバックアップ処理を呼び出す logger.info( f'I-CTRL-13 [{target_object_name}] CSVデータバックアップ処理呼び出し') backup_crm_csv_data_process(target_object, execute_datetime, csv_string) # 11. CSVアップロード処理を呼び出す logger.info( f'I-CTRL-14 [{target_object_name}] CSVデータアップロード処理呼び出し') copy_crm_csv_data_process(target_object, execute_datetime) # 12. メモリ解放 del crm_data_response del csv_string gc.collect() # 13. 前回取得日時ファイル更新処理を呼びだす logger.info( f'I-CTRL-15 [{target_object_name}] 前回取得日時ファイル更新処理呼び出し') upload_last_fetch_datetime_process(target_object, last_fetch_datetime) # 14. オブジェクトのアップロードが完了した旨をログに出力する logger.info(f'I-CTRL-16 [{target_object_name}] 処理正常終了') return def _check_process_result(process_result: dict) -> None: """取得処理結果がすべて成功か、一部失敗しているかを判定し、ログ出力する Args: process_result (dict): 取得処理結果辞書オブジェクト """ if not all([v == 'success' for v in process_result.values()]): logger.error('E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください') return logger.info('I-CTRL-19 すべてのデータの取得に成功しました') return