diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index beb17f53..c97d40eb 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -90,14 +90,7 @@ def inst_emp_csv_upload_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - mainte_csv_up = InstEmpCsvUploadViewModel( - # is_verified=False, - # select_function="", - # select_table="", - # new_inst_emp="", - # dialog_msg="", - # error_list=[] - ) + mainte_csv_up = InstEmpCsvUploadViewModel() # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 0edf92c8..4400c318 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -1,54 +1,46 @@ import csv from io import TextIOWrapper +from datetime import datetime from abc import ABCMeta, abstractmethod from src.system_var import constants -from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository -from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository -from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository -from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository -from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository -from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository -from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.repositories.mst_inst_repository import MstInstRepository +from src.repositories.bu_master_cd_repository import BuMasterRepository +from src.repositories.emp_master_repository import EmpMasterRepository +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') class MasterMainteCSVItem(metaclass=ABCMeta): - select_table: str + csv_row: list[str] + table_name: str line_num: str - csv_row: list[str] # dictで持つかどうかは要検討 - inst_cd: str - ta_cd: str - emp_cd: str - inst_cd_repository: MenteExistInstCdRepository - emp_cd_repository: MenteExistEmpCdRepository - bu_cd_repository: MenteExistBuCdRepository - dummy_data_repository: MenteExistDummyDataRepository - real_data_repository: MenteExistRealDataRepository - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): - self.select_table = select_table # ダミー or 本番 - self.csv_row = csv_row # CSVの1行 - self.line_num = line_num # CSVの行数 - self.inst_cd_repository = inst_cd_repository - self.emp_cd_repository = emp_cd_repository - self.bu_cd_repository = bu_cd_repository - self.dummy_data_repository = dummy_data_repository - self.real_data_repository = real_data_repository - self.emp_chg_inst_repository = emp_chg_inst_repository + self.csv_row = csv_row + self.table_name = table_name + self.line_num = line_num + self.mst_inst_repository = mst_inst_repository + self.emp_master_repository = emp_master_repository + self.bu_master_repository = bu_master_repository + self.emp_chginst_repository = emp_chginst_repository - def validate(self) -> list[list[str]]: + def validate(self) -> list[str]: """ 項目のバリデーションを行うテンプレートメソッド\n 各チェックロジックはサブクラスで実装する @@ -64,7 +56,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): # BuCd存在チェック error_list.extend(self.check_bu_cd_exists()) # 適用開始日 < 適用終了日、実在日チェック - # error_list.extend(self.check_existing_date()) + error_list.extend(self.check_existing_date()) # 項目数チェック error_list.extend(self.check_item_count()) # データ存在チェック @@ -74,28 +66,70 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list = [error for error in error_list if len(error) != 0] return error_list - # protected? def check_csv_item_count(self, item_count: int) -> list[str]: error_list = [] for col_num, row in enumerate(self.csv_row, start=1): if col_num > item_count and row is not None and len(row) > 0: - error_list.append([self.line_num, '', constants.CSV_UP_ITEM_CNT_ERR, 'の項目数が一致しません。項目数を確認してください。']) + error_list.append(f'{self.line_num}行目の項目数が一致しません。項目数を確認してください。') break return error_list def emp_chg_inst_count(self, start_date: str): - table_name = 'src05.emp_chg_inst_wrk' if self.select_table == 'dummy' else 'src05.emp_chg_inst' - # pythonは子クラスのメンバも親から呼べる? - return self.emp_chg_inst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, table_name) + return self.emp_chginst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, self.table_name) def is_error_emp_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False - if self.emp_cd_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: + if self.emp_master_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: return True return False + def is_exist_inst_cd(self) -> bool: + return True if self.mst_inst_repository.fetch_count(self.inst_cd) > 0 else False + + def is_exist_bu_cd(self) -> bool: + return True if self.bu_master_repository.fetch_count(self.bu_cd) > 0 else False + + def make_require_error_message(self, line_num: str, col_name: str) -> str: + return f'{line_num}行目の{col_name}が入力されておりません。' + + def __parse_str_to_date(self, check_date: str) -> tuple[bool, datetime]: + try: + check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') + except Exception as e: + logger.exception(f'適用期間の日付が不正{e}') + return (False, None) + + try: + reverse_check_date: str = check_date_time.strftime('%Y%m%d') + except Exception as e: + logger.exception(f'適用期間の日付が不正{e}') + return (False, None) + + if check_date != reverse_check_date: + return (False, None) + + return (True, check_date_time) + + def check_term_date(self, + start_date: str, + end_date: str, + start_date_col_name: str, + end_date_col_name: str) -> tuple[list[str], datetime, datetime]: + error_list = [] + + if start_date is not None: + (result, start_date_time) = self.__parse_str_to_date(start_date) + if result is False: + error_list.append(f'{self.line_num}行目の{start_date_col_name}が実在しない日付になっています。') + if end_date is not None: + (result, end_date_time) = self.__parse_str_to_date(end_date) + if result is False: + error_list.append(f'{self.line_num}行目の{end_date_col_name}が実在しない日付になっています。') + + return (error_list, start_date_time, end_date_time) + @abstractmethod def csv_row_data(self) -> dict: pass @@ -107,34 +141,27 @@ class MasterMainteCSVItem(metaclass=ABCMeta): pass ... + @abstractmethod def check_inst_cd_exists(self) -> list[str]: - error_list = [] - - inst_cd_count = self.inst_cd_repository.fetch_count(self.inst_cd) - if inst_cd_count == 0: - # 親クラスに持った方がいいので即値指定 - error_list.append([self.line_num, '施設コード', constants.CSV_UP_NOT_EXIST_INST_CD_ERR, '']) - return error_list + """InstCD存在チェック""" + pass + ... @abstractmethod def check_emp_cd_exists(self) -> list[str]: """MUID存在チェック""" pass + ... + @abstractmethod def check_bu_cd_exists(self) -> list[str]: """BuCd存在チェック""" - error_list = [] - - bu_cd_count = self.bu_cd_repository.fetch_count(self.bu_cd) - if bu_cd_count == 0: - # 親クラスに持った方がいいので即値指定 - error_list.append([self.line_num, 'ビジネスユニットコード', constants.CSV_UP_NOT_EXIST_BU_CD_ERR, '']) - return error_list + pass + ... @abstractmethod def check_existing_date(self) -> list[str]: """適用開始日 < 適用終了日、実在日チェック""" - pass @abstractmethod def check_item_count(self) -> list[str]: @@ -146,6 +173,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): def check_data_exists(self) -> list[str]: """データ存在チェック""" pass + ... class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): @@ -156,32 +184,28 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): # emp_cd: str # d emp_name_family: str # e emp_name_first: str # f - bu_cd: str # g + # bu_cd: str # g start_date: str # h end_date: str # i def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): super().__init__( csv_row, - select_table, + table_name, line_num, - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository ) self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] # a self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] # b @@ -199,45 +223,66 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_require(self) -> list[str]: error_list = [] if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) # エラーコードを入れないと、出力制御が難しい。 - # メッセージの一部を配列に混ぜるかどうか検討 + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO])) if len(self.bu_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO])) if len(self.start_date) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE])) if len(self.end_date) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE])) return error_list + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_inst_cd() is False: + error_list.append( + f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') + return error_list + def check_emp_cd_exists(self) -> list[str]: error_list = [] if self.start_date is None or len(self.start_date) == 0: return error_list if super().is_error_emp_cd(self.start_date) is True: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + def check_bu_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_bu_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + (error_list, start_date_time, end_date_time) = super().check_term_date( + self.start_date, + self.end_date, + constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], + constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]) + if len(error_list) > 0 or self.start_date is None or self.end_date is None: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE]}\ +が{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]}よりも後の日付になっています。') return error_list def check_item_count(self) -> list[str]: @@ -246,17 +291,14 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_data_exists(self) -> list[str]: error_list = [] if super().emp_chg_inst_count(self.start_date) > 0: - error_list.append([self.line_num, '', constants.CSV_UP_NEW_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、適用開始日がすべて同一のデータが既に登録されています。') return error_list - def check_existing_date(self) -> list[str]: - return [] - class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): """施設担当者変更登録CSV""" - bu_cd: str # a + # bu_cd: str # a bu_name: str # b org_cd: str # c org_short_name: str # d @@ -274,25 +316,21 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): super().__init__( csv_row, - select_table, + table_name, line_num, - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository ) self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] @@ -317,69 +355,59 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list = [] if self.comment == '追加': if len(self.bu_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO])) if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants. - CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.inst_emp_end_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '終了': if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.change_end_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message(self.line_num, constants.CHANGE_INST_EMP_MAP[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '担当者修正': if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants. - CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) else: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_COMMENT], - constants.CSV_UP_COMMENT_ERR, - 'のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。']) + error_list.append(f'{self.line_num}行目のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。') + return error_list + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_inst_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') return error_list def check_emp_cd_exists(self) -> list[str]: @@ -389,8 +417,45 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): return error_list if super().is_error_emp_cd(self.inst_emp_start_date) is True: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + + def check_bu_cd_exists(self) -> list[str]: + """BuCd存在チェック""" + error_list = [] + + if super().is_exist_bu_cd() is False: + + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + start_date = self.inst_emp_start_date + if self.comment == '追加' or self.comment == '終了': + if self.comment == '追加': + end_date = self.inst_emp_end_date + end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' + else: + end_date = self.change_end_date + end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' + + (error_list, start_date_time, end_date_time) = super().check_term_date( + start_date, + end_date, + constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + end_date_col_name) + if len(error_list) > 0 or self.start_date is None or self.end_date is None: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{compare_error_message}') return error_list def check_item_count(self) -> list[str]: @@ -400,15 +465,13 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list = [] emp_chg_inst_count = super().emp_chg_inst_count(self.inst_emp_start_date) if self.comment == '追加' and emp_chg_inst_count > 0: - error_list.append([self.line_num, '', constants.CSV_UP_ADD_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが既に登録されています。') + elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: - error_list.append([self.line_num, '', constants.CSV_UP_UPDATE_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') return error_list - def check_existing_date(self) -> list[str]: - return [] - class MasterMainteCSVItems: """施設担当者CSVをループで回すためのもの""" @@ -432,46 +495,39 @@ class MasterMainteCSVItems: def __init__( self, file: TextIOWrapper, - csv_upload_form: MasterMainteCsvUpModel, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + select_function: str, + table_name: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ) -> None: - # self.header = file.readline().strip('\n').replace('"', '').split(',') - # reader = csv.DictReader(file, fieldnames=self.header) reader = csv.reader(file) csv_rows = [] - if csv_upload_form.select_function == 'new': + if select_function == 'new': for line_num, row in enumerate(reader, start=0): if line_num == 0: continue csv_rows.append(MasterMainteNewInstEmpCSVItem( row, - csv_upload_form.select_table, + table_name, str(line_num), - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository) + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) ) - elif csv_upload_form.select_function == 'change': + elif select_function == 'change': for line_num, row in enumerate(reader, start=0): if line_num == 0: continue csv_rows.append(MasterMainteChangeInstEmpCSVItem( row, - csv_upload_form.select_table, + table_name, str(line_num), - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository) + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) ) self.lines = csv_rows diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py new file mode 100644 index 00000000..cc25ad26 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py @@ -0,0 +1,166 @@ +from abc import ABCMeta, abstractmethod +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') + + +class MasterMainteEmpChg(metaclass=ABCMeta): + insert_data: list[dict] + table_name: str + select_table_message: str + user_name: str + emp_chginst_repository: EmpChgInstRepository + + def __init__( + self, + insert_data, + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + self.insert_data = insert_data + self.table_name = table_name + self.select_table_message = select_table_message + self.user_name = user_name + self.emp_chginst_repository = emp_chginst_repository + + def save(self): + error_list = [] + try: + self.emp_chginst_repository.connect() + self.emp_chginst_repository.begin() + (result_message, error_list) = self.write_emp_chg_inst_table() + if len(error_list) > 0: + self.emp_chginst_repository.rollback() + else: + self.emp_chginst_repository.commit() + except Exception as e: + self.emp_chginst_repository.rollback() + raise e + finally: + self.emp_chginst_repository.disconnect() + + return (result_message, error_list) + + def add_emp_chg_inst_table(self, data, start_date, end_date): + self.emp_chginst_repository.insert_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['MUID'], + data['ビジネスユニットコード'], + start_date, + end_date, + self.user_name, + self.user_name, + self.table_name) + + @abstractmethod + def write_emp_chg_inst_table(self): + pass + + +class MasterMainteNewEmpChg(MasterMainteEmpChg): + + def __init__( + self, + insert_data_list: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + super().__init__( + insert_data_list, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + error_list = [] + + add_count = 0 + for row_no, data in enumerate(self.insert_data, start=1): + try: + self.add_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) + add_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + logger.info(f'新規施設登録時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('新規施設登録を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + return (result_message_list, error_list) + + +class MasterMainteChangeEmpChg(MasterMainteEmpChg): + + def __init__( + self, + insert_data: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + + ): + super().__init__( + insert_data, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + add_count = 0 + end_count = 0 + modify_count = 0 + error_list = [] + for row_no, data in enumerate(self.insert_data, start=1): + try: + if data['コメント'] == '追加': + self.add_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) + add_count += 1 + elif data['コメント'] == '終了': + self.__end_emp_chg_inst(data) + end_count += 1 + elif data['コメント'] == '担当者修正': + self.__modify_emp_chg_inst(data) + modify_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + logger.info(f'施設担当者変更時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('施設担当者変更を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + result_message_list.append('修正:' + str(modify_count) + '件') + result_message_list.append('終了:' + str(end_count) + '件') + return (result_message_list, error_list) + + def __end_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.end_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['終了日の変更'], + self.user_name, + self.table_name) + + def __modify_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.modify_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['MUID'], + self.user_name, + self.table_name) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py b/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py deleted file mode 100644 index d709487f..00000000 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py +++ /dev/null @@ -1,161 +0,0 @@ -from abc import ABCMeta, abstractmethod -from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository - -from src.system_var import constants - - -class MasterMainteInsertEmpChg(metaclass=ABCMeta): - insert_data: list[dict] - table_name: str - select_table_message: str - user_name: str - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - - def __init__( - self, - insert_data, - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - ): - self.insert_data = insert_data - self.table_name = table_name # ダミー or 本番 - self.select_table_message = select_table_message - self.user_name = user_name - self.emp_chg_inst_repository = emp_chg_inst_repository - - def insert_emp_chg_inst(self): - error_list = [] - try: - self.emp_chg_inst_repository.connect() - self.emp_chg_inst_repository.begin() - (result_message, error_list) = self.write_emp_chg_inst_table() - if len(error_list) > 0: - self.emp_chg_inst_repository.rollback() - else: - self.emp_chg_inst_repository.commit() - except Exception: - self.emp_chg_inst_repository.rollback() # 一つでもエラーが発生したら終了するようにする場合はここで - - finally: - self.emp_chg_inst_repository.disconnect() - - return (result_message, error_list) - - def insert_emp_chg_inst_table(self, data, start_date, end_date): - self.emp_chg_inst_repository.insert_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['MUID'], - data['ビジネスユニットコード'], - start_date, - end_date, - self.user_name, - self.user_name, - self.table_name) - - @abstractmethod - def write_emp_chg_inst_table(self): - pass - - -class MasterMainteNewInsertEmpChg(MasterMainteInsertEmpChg): - - def __init__( - self, - insert_data_list: list[dict], - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - ): - super().__init__( - insert_data_list, - table_name, - select_table_message, - user_name, - emp_chg_inst_repository - ) - - def write_emp_chg_inst_table(self): - error_list = [] - - add_count = 0 - for row_no, data in enumerate(self.insert_data, start=1): - try: - self.insert_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) - add_count += 1 - except Exception: - error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? - - result_message_list = [] - result_message_list.append('新規施設登録を行いました') - result_message_list.append('対象:' + self.select_table_message) - result_message_list.append('追加:' + str(add_count) + '件') - return (result_message_list, error_list) - - -class MasterMainteChangeInsertEmpChg(MasterMainteInsertEmpChg): - - def __init__( - self, - insert_data: list[dict], - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - - ): - super().__init__( - insert_data, - table_name, - select_table_message, - user_name, - emp_chg_inst_repository - ) - - def write_emp_chg_inst_table(self): - add_count = 0 - end_count = 0 - modify_count = 0 - error_list = [] # 例外が発生する仕組みなのでどうするか? - for row_no, data in enumerate(self.insert_data, start=1): - try: - if data['コメント'] == '追加': - self.insert_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) - add_count += 1 - elif data['コメント'] == '終了': - self.__end_emp_chg_inst(data) - end_count += 1 - elif data['コメント'] == '担当者修正': - self.__modify_end_emp_chg_inst(data) - modify_count += 1 - except Exception: - error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? - - result_message_list = [] - result_message_list.append('施設担当者変更を行いました') - result_message_list.append('対象:' + self.select_table_message) - result_message_list.append('追加:' + str(add_count) + '件') - result_message_list.append('修正:' + str(modify_count) + '件') - result_message_list.append('終了:' + str(end_count) + '件') - return (result_message_list, error_list) - - def __end_emp_chg_inst(self, data: dict): - self.emp_chg_inst_repository.end_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['施設担当_開始日'], - data['終了日の変更'], - self.user_name, - self.table_name) - - def __modify_end_emp_chg_inst(self, data: dict): - self.emp_chg_inst_repository.modify_end_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['施設担当_開始日'], - data['MUID'], - self.user_name, - self.table_name) diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py index 9d29f508..1cd0157c 100644 --- a/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py @@ -10,7 +10,7 @@ class InstEmpCsvUploadViewModel(BaseModel): subtitle: str = '施設担当者データCSVアップロード' is_verified: Optional[bool] is_insert: Optional[bool] - error_list: Optional[list[CsvErrorModel]] + error_message_list: Optional[list[CsvErrorModel]] select_function: Optional[str] select_table: Optional[str] csv_file_name: Optional[str] @@ -34,8 +34,8 @@ class InstEmpCsvUploadViewModel(BaseModel): def is_select_table_empty(self): return self.select_table is None or len(self.select_table) == 0 - def is_error_list_empty(self): - return self.error_list is None or len(self.error_list) == 0 + def is_error_message_list_empty(self): + return self.error_message_list is None or len(self.error_message_list) == 0 def csv_data_count(self): return 0 if self.csv_upload_list is None else len(self.csv_upload_list) diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py index 4fb4e241..2cf9ac13 100644 --- a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py +++ b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py @@ -1,30 +1,9 @@ from pydantic import BaseModel from typing import Optional -from src.system_var import constants class CsvErrorModel(BaseModel): - row_no: Optional[str] - item_name: Optional[str] - message: Optional[str] - error_code: Optional[str] + error_message: Optional[str] - def __init__(self, row_no: str, item_name: str, error_code: str, message: str) -> None: - super().__init__(row_no=row_no, item_name=item_name, - error_code=error_code, message=message) - - # 確認のため途中まで実装 エラーコードが無いと、メッセージの編集が適切にできない場合あり - - def error_message(self): - error_message: str = '' - if self.error_code == constants.CSV_UP_NULL_ERR: - error_message = self.row_no + '行目の' + self.item_name + 'が入力されておりません。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_INST_CD_ERR: - error_message = self.row_no + '行目の施設コードは施設マスタに存在しないコードです。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_EMP_CD_ERR: - error_message = self.row_no + '行目のMUIDは従業員マスタに存在しない もしくは 適用期間外のIDです。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_BU_CD_ERR: - error_message = self.row_no + '行目のビジネスユニットコードはビジネスユニットマスタに存在しないコードです。' - elif self.error_code == constants.CSV_UP_SQL_ERR: - error_message = self.row_no + '行目がSQL実行エラーです。Excelファイルを確認してください。' - return error_message + def __init__(self, error_message: str) -> None: + super().__init__(error_message=error_message) diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py similarity index 91% rename from ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py rename to ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py index 2305f884..62b24de0 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistBuCdRepository(BaseRepository): +class BuMasterRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py similarity index 71% rename from ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py rename to ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 4a2856ec..b90ea51c 100644 --- a/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -1,7 +1,8 @@ from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel -class MenteWriteEmpChgInstRepository(BaseRepository): +class EmpChgInstRepository(BaseRepository): def connect(self): self._database.connect() @@ -109,7 +110,7 @@ class MenteWriteEmpChgInstRepository(BaseRepository): and start_date = :start_date """ - def modify_end_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): + def modify_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): try: query = self.UPDATE_SQL.format(table_name=table_name) self._database.execute(query, { @@ -122,3 +123,30 @@ class MenteWriteEmpChgInstRepository(BaseRepository): except Exception as e: print(f"[ERROR] DB Error : Exception={e.args}") raise e + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + {table_name} + WHERE + inst_cd = :inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + + def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL.format(table_name=table_name) + result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'start_date': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py similarity index 93% rename from ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py rename to ecs/jskult-webapp/src/repositories/emp_master_repository.py index d7619719..631bd643 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistEmpCdRepository(BaseRepository): +class EmpMasterRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py deleted file mode 100644 index bb892aa2..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py +++ /dev/null @@ -1,34 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistDummyDataRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - src05.emp_chg_inst_wrk - WHERE - inst_cd = :instCd - AND ta_cd = :taCd - AND start_date = :startDate - """ - - def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, - {'instCd': inst_cd, - 'taCd': ta_cd, - 'startDate': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py deleted file mode 100644 index 4c321de7..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py +++ /dev/null @@ -1,32 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistEmpChgInstRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - {table_name} - WHERE - inst_cd = :inst_cd - AND ta_cd = :ta_cd - AND start_date = :start_date - """ - - def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL.format(table_name=table_name) - result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, - 'start_date': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py deleted file mode 100644 index bf74305c..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py +++ /dev/null @@ -1,34 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistRealDataRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - src05.emp_chg_inst - WHERE - inst_cd = :instCd - AND ta_cd = :taCd - AND start_date = :startDate - """ - - def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, - {'instCd': inst_cd, - 'taCd': ta_cd, - 'startDate': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py similarity index 91% rename from ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py rename to ecs/jskult-webapp/src/repositories/mst_inst_repository.py index e360e494..bafcc525 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistInstCdRepository(BaseRepository): +class MstInstRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index f68cba6b..4ca8f624 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -5,77 +5,71 @@ from src.aws.aws_api_client import AWSAPIClient from src.repositories.base_repository import BaseRepository from src.services.base_service import BaseService from src.model.internal.master_mainte_csv import MasterMainteCSVItems -from src.model.internal.master_mainte_insert_emp_chg import MasterMainteChangeInsertEmpChg -from src.model.internal.master_mainte_insert_emp_chg import MasterMainteNewInsertEmpChg +from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg +from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel from src.logging.get_logger import get_logger from src.model.view.mainte_csv_upload_model import CsvUploadModel from src.model.view.mainte_csv_error_model import CsvErrorModel -from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository -from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository -from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository -from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository -from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository -from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository -from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository +from src.repositories.mst_inst_repository import MstInstRepository +from src.repositories.bu_master_cd_repository import BuMasterRepository +from src.repositories.emp_master_repository import EmpMasterRepository +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository logger = get_logger('マスターメンテ') class MasterMainteService(BaseService): REPOSITORIES = { - 'inst_cd_repository': MenteExistInstCdRepository, - 'emp_cd_repository': MenteExistEmpCdRepository, - 'bu_cd_repository': MenteExistBuCdRepository, - 'dummy_data_repository': MenteExistDummyDataRepository, - 'real_data_repository': MenteExistRealDataRepository, - 'emp_chg_inst_repository': MenteExistEmpChgInstRepository, - 'write_emp_chg_inst_repository': MenteWriteEmpChgInstRepository + 'mst_inst_repository': MstInstRepository, + 'emp_master_repository': EmpMasterRepository, + 'bu_master_repository': BuMasterRepository, + 'emp_chginst_repository': EmpChgInstRepository, } - inst_cd_repository: MenteExistInstCdRepository - emp_cd_repository: MenteExistEmpCdRepository - bu_cd_repository: MenteExistBuCdRepository - dummy_data_repository: MenteExistDummyDataRepository - real_data_repository: MenteExistRealDataRepository - emp_chg_inst_repository: MenteExistEmpChgInstRepository - write_emp_chg_inst_repository: MenteWriteEmpChgInstRepository + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) - self.inst_cd_repository = repositories['inst_cd_repository'] - self.emp_cd_repository = repositories['emp_cd_repository'] - self.bu_cd_repository = repositories['bu_cd_repository'] - self.dummy_data_repository = repositories['dummy_data_repository'] - self.real_data_repository = repositories['real_data_repository'] - self.emp_chg_inst_repository = repositories['emp_chg_inst_repository'] - self.write_emp_chg_inst_repository = repositories['write_emp_chg_inst_repository'] + self.mst_inst_repository = repositories['mst_inst_repository'] + self.emp_master_repository = repositories['emp_master_repository'] + self.bu_master_repository = repositories['bu_master_repository'] + self.emp_chginst_repository = repositories['emp_chginst_repository'] def prepare_mainte_csv_up_view(self, file: TextIOWrapper, csv_file_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + if csv_upload_form.select_function != 'new' and csv_upload_form.select_function == 'change': + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') + if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': + raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') + + (table_name, _) = self.__target_table(csv_upload_form.select_table) + csv_items = MasterMainteCSVItems( file, - csv_upload_form, - self.inst_cd_repository, - self.emp_cd_repository, - self.bu_cd_repository, - self.dummy_data_repository, - self.real_data_repository, - self.emp_chg_inst_repository + csv_upload_form.select_function, + table_name, + self.mst_inst_repository, + self.emp_master_repository, + self.bu_master_repository, + self.emp_chginst_repository ) - error_list = [] + error_message_list = [] for row_item in csv_items: - error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in row_item.validate()]) # 微妙 + error_message_list.extend([CsvErrorModel(data) for data in row_item.validate()]) csv_items.reset() csv_upload_list = [] json_upload_data = '' - if len(error_list) == 0: + if len(error_message_list) == 0: csv_upload_list: list[CsvUploadModel] = [CsvUploadModel( csv_row=row_item.csv_row_data()) for row_item in csv_items] @@ -84,7 +78,7 @@ class MasterMainteService(BaseService): mainte_csv_up = InstEmpCsvUploadViewModel( is_verified=True, - error_list=error_list, + error_message_list=error_message_list, select_function=csv_upload_form.select_function, select_table=csv_upload_form.select_table, csv_upload_list=csv_upload_list, @@ -97,46 +91,46 @@ class MasterMainteService(BaseService): user_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: - if csv_upload_form.select_table == 'dummy': - table_name = 'src05.emp_chg_inst_wrk' - selected_table_msg = 'ダミーテーブル' - elif csv_upload_form.select_table == 'real': - table_name = 'src05.emp_chg_inst' - selected_table_msg = '本番テーブル' - # else: - # 例外? + (table_name, selected_table_msg) = self.__target_table(csv_upload_form.select_table) csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) if csv_upload_form.select_function == 'new': - insert_emp_chg = MasterMainteNewInsertEmpChg( + emp_chg_inst = MasterMainteNewEmpChg( csv_data_list, table_name, selected_table_msg, user_name, - self.write_emp_chg_inst_repository) + self.emp_chginst_repository) elif csv_upload_form.select_function == 'change': - insert_emp_chg = MasterMainteChangeInsertEmpChg( + emp_chg_inst = MasterMainteChangeEmpChg( csv_data_list, table_name, selected_table_msg, user_name, - self.write_emp_chg_inst_repository - ) - # else: - # 例外を発生させる? + self.emp_chginst_repository) + else: + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') - (result_message_list, raw_error_list) = insert_emp_chg.insert_emp_chg_inst() + (result_message_list, raw_error_list) = emp_chg_inst.save() - error_list = [] - error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in raw_error_list]) - - if result_message_list is None: - result_message_list.append('DB接続エラー') + error_message_list = [] + error_message_list.extend([CsvErrorModel(data) for data in raw_error_list]) mainte_csv_up = InstEmpCsvUploadViewModel( is_insert=True, result_message_list=result_message_list, - error_list=error_list + error_message_list=error_message_list ) return mainte_csv_up + + def __target_table(self, select_table: str): + if select_table == 'dummy': + table_name = 'src05.emp_chg_inst_wrk' + selected_table_msg = 'ダミーテーブル' + elif select_table == 'real': + table_name = 'src05.emp_chg_inst' + selected_table_msg = '本番テーブル' + else: + raise Exception(f'登録テーブルの選択値が不正です: {select_table}') + return (table_name, selected_table_msg) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index a59c1681..ed02abb8 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -23,7 +23,7 @@ h1{ width: 20%; } -.buttonSize{ +.csvup_buttonSize{ width: 85px; } diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 0e0a8b0a..27d07283 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -214,30 +214,6 @@ CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 # コメントの列No CSV_CHANGE_COMMENT = 13 - -# エラーコード -CSV_UP_NULL_ERR = 'nullError' -CSV_UP_COMMENT_ERR = 'commentError' -CSV_UP_NOT_EXIST_INST_CD_ERR = 'instCdErr' -CSV_UP_NOT_EXIST_EMP_CD_ERR = 'empCdErr' -CSV_UP_NOT_EXIST_BU_CD_ERR = 'buCdErr' -CSV_UP_ITEM_CNT_ERR = 'itemCntErr' -CSV_UP_FILE_TYPE_ERR = 'fileTypeErr' -CSV_UP_FILEN_EXIST_ERR = 'filenExistErr' -CSV_UP_SQL_ERR = 'sqlErr' -CSV_UP_NEW_COMPARE_DATE_ERR = 'newCompareDateErr' -CSV_UP_ADD_COMPARE_DATE_ERR = 'addCompareDateErr' -CSV_UP_END_COMPARE_DATE_ERR = 'endCompareDateErr' -CSV_UP_START_DATE_REAL_ERR = 'startDateRealErr' -CSV_UP_END_DATE_REAL_ERR = 'endDateRealErr' -CSV_UP_INST_EMPSTART_DATE_REAL_ERR = 'instEmpStartDateRealErr' -CSV_UP_INST_EMP_END_DATE_REAL_ERR = 'instEmpEndDateRealErr' -CSV_UP_CHANGE_END_DATE_REAL_ERR = 'changeEndDateRealErr' -CSV_UP_NEW_DATA_DUP_ERR = 'newDataDupErr' -CSV_UP_ADD_DATA_DUP_ERR = 'addDataDupErr' -CSV_UP_UPDATE_DATA_DUP_ERR = 'updateDataDupErr' -CSV_UP_INPUT_DATA_ZERO_ERR = 'inputDataZeroErr' - # CSVの列数 CSV_NEW_COL_COUNT = 9 CSV_CHANGE_COL_COUNT = 14 diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 2c318134..50a1b2bd 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -40,19 +40,19 @@