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 c889a37e..d6344393 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -1,4 +1,6 @@ import csv +import json + from io import TextIOWrapper from datetime import datetime from abc import ABCMeta, abstractmethod @@ -47,20 +49,21 @@ class MasterMainteCSVItem(metaclass=ABCMeta): エラーが有る場合、[行数、項目名: エラー内容]のリストを返す """ error_list = [] - # 必須チェック 及び コメントエラーチェック - error_list.extend(self.check_require()) - # 施設コード存在チェック - error_list.extend(self.check_inst_cd_exists()) - # MUID存在チェック - error_list.extend(self.check_emp_cd_exists()) - # BuCd存在チェック - error_list.extend(self.check_bu_cd_exists()) - # 適用開始日 < 適用終了日、実在日チェック - error_list.extend(self.check_existing_date()) # 項目数チェック error_list.extend(self.check_item_count()) - # データ存在チェック - error_list.extend(self.check_data_exists()) + if len(error_list) > 0: + # 必須チェック 及び コメントエラーチェック + error_list.extend(self.check_require()) + # 施設コード存在チェック + error_list.extend(self.check_inst_cd_exists()) + # MUID存在チェック + error_list.extend(self.check_emp_cd_exists()) + # BuCd存在チェック + error_list.extend(self.check_bu_cd_exists()) + # 適用開始日 < 適用終了日、実在日チェック + error_list.extend(self.check_existing_date()) + # データ存在チェック + error_list.extend(self.check_data_exists()) # エラーのないリストを省いて返す error_list = [error for error in error_list if len(error) != 0] @@ -69,19 +72,18 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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(f'{self.line_num}行目の項目数が一致しません。項目数を確認してください。') - break + if not len(self.csv_row) == item_count: + error_list.append(f'{self.line_num}行目の項目数が一致しません。項目数を確認してください。') + return error_list def emp_chg_inst_count(self, start_date: str): 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: + def is_exist_emp_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False - if self.emp_master_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: + if self.emp_master_repository.fetch_count(self.emp_cd, start_date) == 0: return True return False @@ -130,6 +132,14 @@ class MasterMainteCSVItem(metaclass=ABCMeta): return (error_list, start_date_time, end_date_time) + def get_csv_value(self, column_no: int): + try: + column_value = self.csv_row[column_no] + except IndexError: + column_value = '' + + return column_value + @abstractmethod def csv_row_data(self) -> dict: pass @@ -203,17 +213,15 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) - # get_csv_value() indexerrorでキャッチするメソッドを追加する - - self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] - self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] - self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO] - self.emp_cd = self.csv_row[constants.CSV_NEW_EMP_CD_COL_NO] - self.emp_name_family = self.csv_row[constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO] - self.emp_name_first = self.csv_row[constants.CSV_NEW_EMP_NAME_FIRST_COL_NO] - self.bu_cd = self.csv_row[constants.CSV_NEW_BU_CD_COL_NO] - self.start_date = self.csv_row[constants.CSV_NEW_START_DATE] - self.end_date = self.csv_row[constants.CSV_NEW_END_DATE] + self.inst_cd = super().get_csv_value(constants.CSV_NEW_INST_CD_COL_NO) + self.inst_name = super().get_csv_value(constants.CSV_NEW_INST_NAME_COL_NO) + self.ta_cd = super().get_csv_value(constants.CSV_NEW_TA_CD_COL_NO) + self.emp_cd = super().get_csv_value(constants.CSV_NEW_EMP_CD_COL_NO) + self.emp_name_family = super().get_csv_value(constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO) + self.emp_name_first = super().get_csv_value(constants.CSV_NEW_EMP_NAME_FIRST_COL_NO) + self.bu_cd = super().get_csv_value(constants.CSV_NEW_BU_CD_COL_NO) + self.start_date = super().get_csv_value(constants.CSV_NEW_START_DATE) + self.end_date = super().get_csv_value(constants.CSV_NEW_END_DATE) def csv_row_data(self) -> dict: return {constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} @@ -255,7 +263,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): 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: + if super().is_exist_emp_cd(self.start_date) is True: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list @@ -284,7 +292,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): return error_list def check_item_count(self) -> list[str]: - return super().check_csv_item_count(constants.CSV_NEW_COL_COUNT) + return super().check_csv_item_count(len(constants.NEW_INST_EMP_CSV_LOGICAL_NAMES)) def check_data_exists(self) -> list[str]: error_list = [] @@ -326,22 +334,20 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) - # self.bu_cd = get_csv_value(constants.CSV_CHANGE_BU_CD_COL_NO) ← IndexErrorでtry catch - - self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] - self.bu_name = self.csv_row[constants.CSV_CHANGE_BU_NAME_COL_NO] - self.org_cd = self.csv_row[constants.CSV_CHANGE_ORG_CD_COL_NO] - self.org_short_name = self.csv_row[constants.CSV_CHANGE_ORG_SHORT_NAME_COL_NO] - self.inst_cd = self.csv_row[constants.CSV_CHANGE_INST_CD_COL_NO] - self.inst_name = self.csv_row[constants.CSV_CHANGE_INST_NAME_COL_NO] - self.ta_cd = self.csv_row[constants.CSV_CHANGE_TA_CD_COL_NO] - self.explain = self.csv_row[constants.CSV_CHANGE_EXPLAIN_COL_NO] - self.emp_cd = self.csv_row[constants.CSV_CHANGE_EMP_CD_COL_NO] - self.emp_full_name = self.csv_row[constants.CSV_CHANGE_EMP_FULL_NAME_COL_NO] - self.inst_emp_start_date = self.csv_row[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO] - self.inst_emp_end_date = self.csv_row[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] - self.change_end_date = self.csv_row[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] - self.comment = self.csv_row[constants.CSV_CHANGE_COMMENT] + self.bu_cd = super().get_csv_value(constants.CSV_CHANGE_BU_CD_COL_NO) + self.bu_name = super().get_csv_value(constants.CSV_CHANGE_BU_NAME_COL_NO) + self.org_cd = super().get_csv_value(constants.CSV_CHANGE_ORG_CD_COL_NO) + self.org_short_name = super().get_csv_value(constants.CSV_CHANGE_ORG_SHORT_NAME_COL_NO) + self.inst_cd = super().get_csv_value(constants.CSV_CHANGE_INST_CD_COL_NO) + self.inst_name = super().get_csv_value(constants.CSV_CHANGE_INST_NAME_COL_NO) + self.ta_cd = super().get_csv_value(constants.CSV_CHANGE_TA_CD_COL_NO) + self.explain = super().get_csv_value(constants.CSV_CHANGE_EXPLAIN_COL_NO) + self.emp_cd = super().get_csv_value(constants.CSV_CHANGE_EMP_CD_COL_NO) + self.emp_full_name = super().get_csv_value(constants.CSV_CHANGE_EMP_FULL_NAME_COL_NO) + self.inst_emp_start_date = super().get_csv_value(constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO) + self.inst_emp_end_date = super().get_csv_value(constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO) + self.change_end_date = super().get_csv_value(constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO) + self.comment = super().get_csv_value(constants.CSV_CHANGE_COMMENT) def csv_row_data(self) -> dict: return {constants.CHANGE_INST_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} @@ -416,7 +422,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if self.comment != '追加' and self.comment != '担当者修正': return error_list - if super().is_error_emp_cd(self.inst_emp_start_date) is True: + if super().is_exist_emp_cd(self.inst_emp_start_date) is True: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list @@ -462,7 +468,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): return error_list def check_item_count(self) -> list[str]: - return super().check_csv_item_count(constants.CSV_CHANGE_COL_COUNT) + return super().check_csv_item_count(len(constants.CHANGE_INST_CSV_LOGICAL_NAMES)) def check_data_exists(self) -> list[str]: error_list = [] @@ -480,11 +486,17 @@ class MasterMainteCSVItems: """施設担当者CSVをループで回すためのもの""" lines: list[MasterMainteCSVItem] __i: int = 0 - header: list[str] def reset(self): self.__i = 0 + def to_json(self): + # CSVをjsonに変換 + csv_row_dict_list: list[dict] = [row_item.csv_row_data() for row_item in self.lines] + + # json作成 + return json.dumps(csv_row_dict_list, ensure_ascii=False) + def __iter__(self): return self @@ -507,30 +519,44 @@ class MasterMainteCSVItems: ) -> None: reader = csv.reader(file) csv_rows = [] - if select_function == 'new': - for line_num, row in enumerate(reader, start=0): - if line_num == 0: - continue - csv_rows.append(MasterMainteNewInstEmpCSVItem( - row, - table_name, - str(line_num), - mst_inst_repository, - emp_master_repository, - bu_master_repository, - emp_chginst_repository) - ) - elif select_function == 'change': - for line_num, row in enumerate(reader, start=0): - if line_num == 0: - continue - csv_rows.append(MasterMainteChangeInstEmpCSVItem( - row, - table_name, - str(line_num), - mst_inst_repository, - emp_master_repository, - bu_master_repository, - emp_chginst_repository) - ) + for line_num, row in enumerate(reader, start=0): + if line_num == 0: + continue + csv_rows.append(self.__select_function( + select_function, + row, + table_name, + line_num, + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository)) self.lines = csv_rows + + def __select_function(self, + function_type: str, + row: list[str], + table_name: str, + line_num: int, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository) -> MasterMainteCSVItem: + if function_type == 'new': + return MasterMainteNewInstEmpCSVItem( + row, + table_name, + str(line_num), + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) + elif function_type == 'change': + return MasterMainteChangeInstEmpCSVItem( + row, + table_name, + str(line_num), + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) 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_inst_function.py similarity index 94% rename from ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py rename to ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py index cc25ad26..f272e50c 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py @@ -5,7 +5,7 @@ from src.logging.get_logger import get_logger logger = get_logger('マスターメンテ') -class MasterMainteEmpChg(metaclass=ABCMeta): +class MasterMainteEmpChgInstFunction(metaclass=ABCMeta): insert_data: list[dict] table_name: str select_table_message: str @@ -53,7 +53,6 @@ class MasterMainteEmpChg(metaclass=ABCMeta): start_date, end_date, self.user_name, - self.user_name, self.table_name) @abstractmethod @@ -61,7 +60,7 @@ class MasterMainteEmpChg(metaclass=ABCMeta): pass -class MasterMainteNewEmpChg(MasterMainteEmpChg): +class NewEmpChgInstFunction(MasterMainteEmpChgInstFunction): def __init__( self, @@ -99,7 +98,7 @@ class MasterMainteNewEmpChg(MasterMainteEmpChg): return (result_message_list, error_list) -class MasterMainteChangeEmpChg(MasterMainteEmpChg): +class ChangeEmpChgInstFunction(MasterMainteEmpChgInstFunction): def __init__( self, 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 2cf9ac13..097ec780 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 @@ -5,5 +5,5 @@ from typing import Optional class CsvErrorModel(BaseModel): error_message: Optional[str] - def __init__(self, error_message: str) -> None: - super().__init__(error_message=error_message) + # def __init__(self, error_message: str) -> None: + # super().__init__(error_message=error_message) diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index b73700a8..562ad642 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -59,7 +59,7 @@ class EmpChgInstRepository(BaseRepository): """ def insert_emp_chg_inst(self, inst_cd, ta_cd, emp_cd, bu_cd, start_date, - end_date, create_user_name, update_user_name, table_name): + end_date, create_user_name, table_name): try: query = self.INSERT_SQL.format(table_name=table_name) self._database.execute(query, { @@ -70,7 +70,7 @@ class EmpChgInstRepository(BaseRepository): 'start_date': start_date, 'end_date': end_date, 'create_user_name': create_user_name, - 'update_user_name': update_user_name + 'update_user_name': create_user_name }) except Exception as e: logger.exception(f"DB Error : Exception={e.args}") diff --git a/ecs/jskult-webapp/src/repositories/emp_master_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py index 620e4fee..6dfc08f5 100644 --- a/ecs/jskult-webapp/src/repositories/emp_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -14,16 +14,15 @@ class EmpMasterRepository(BaseRepository): src05.emp WHERE emp.EMP_CD = :emp_cd - AND str_to_date(emp.start_date, '%Y%m%d') <= str_to_date(:start_date1, '%Y%m%d') - AND str_to_date(:start_date2 ,'%Y%m%d') <= str_to_date(emp.END_DATE ,'%Y%m%d') + AND str_to_date(emp.start_date, '%Y%m%d') <= str_to_date(:start_work_date, '%Y%m%d') + AND str_to_date(:start_work_date, '%Y%m%d') <= str_to_date(emp.END_DATE ,'%Y%m%d') """ - def fetch_count(self, emp_cd, start_date1, start_date2) -> MasterMenteCountModel: + def fetch_count(self, emp_cd, start_work_date) -> MasterMenteCountModel: try: self._database.connect() query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, {'emp_cd': emp_cd, 'start_date1': start_date1, - 'start_date2': start_date2}) + result = self._database.execute_select(query, {'emp_cd': emp_cd, 'start_work_date': start_work_date}) models = [MasterMenteCountModel(**r) for r in result] if len(models) == 0: return 0 diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index c3d4131e..65de4ca4 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -15,8 +15,8 @@ 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.model.internal.master_mainte_csv import MasterMainteCSVItems -from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg -from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg +from src.model.internal.master_mainte_emp_chg_inst_function import NewEmpChgInstFunction +from src.model.internal.master_mainte_emp_chg_inst_function import ChangeEmpChgInstFunction from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel from src.model.view.table_override_view_model import TableOverrideViewModel from src.model.view.mainte_csv_upload_model import CsvUploadModel @@ -78,8 +78,12 @@ class MasterMainteService(BaseService): ) error_message_list = [] - for row_item in csv_items: - error_message_list.extend([CsvErrorModel(data) for data in row_item.validate()]) + # CSVファイル0件(ヘッダ行のみ)チェック + if len(csv_items) == 0: + error_message_list.append('選択されたExcelファイルの2行目以降に値が記入されておりません。') + else: + for row_item in csv_items: + error_message_list.extend([CsvErrorModel(data) for data in row_item.validate()]) csv_items.reset() csv_upload_list = [] @@ -89,7 +93,7 @@ class MasterMainteService(BaseService): csv_row=row_item.csv_row_data()) for row_item in csv_items] # json作成 - json_upload_data = json.dumps([model.csv_row for model in csv_upload_list], ensure_ascii=False) + json_upload_data = csv_items.to_json() mainte_csv_up = InstEmpCsvUploadViewModel( is_verified=True, @@ -111,14 +115,14 @@ class MasterMainteService(BaseService): csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) if csv_upload_form.select_function == 'new': - emp_chg_inst = MasterMainteNewEmpChg( + emp_chg_inst = NewEmpChgInstFunction( csv_data_list, table_name, selected_table_msg, user_name, self.emp_chginst_repository) elif csv_upload_form.select_function == 'change': - emp_chg_inst = MasterMainteChangeEmpChg( + emp_chg_inst = ChangeEmpChgInstFunction( csv_data_list, table_name, selected_table_msg, diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 6b860ca3..6311df44 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -194,13 +194,6 @@ function resultBtDisablead(){ } } -// Enter押下時にsubmitさせなくする -$(function() { - $(document).on("keypress", "input:not(.allow_submit)", function(event) { - return event.which !== 13; - }); -}); - // 数字-以外を許さない入力チェック function checkNumberForm($this) { @@ -237,7 +230,7 @@ function confirmDialog(strMesssage) { function formInsertBtDisabled(){ var validFlg = false; - if(document.getElementById("excelFile").value === ""){ + if(document.getElementById("csvFile").value === ""){ validFlg = true; } diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index be90eede..0c021b73 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -210,10 +210,6 @@ CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 # コメントの列No CSV_CHANGE_COMMENT = 13 -# CSVアップロードの列数(マスターメンテ) -CSV_NEW_COL_COUNT = 9 # 新規施設担当者登録CSV -CSV_CHANGE_COL_COUNT = 14 # 施設担当者変更登録CSV - # CSVアップロードテーブル名(マスターメンテ) CSV_REAL_TABLE_NAME = '本番テーブル' CSV_CHANGE_TABLE_NAME = 'ダミーテーブル' diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 9968a6f4..d3e6ec18 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -4,7 +4,6 @@ {% with subtitle = mainte_csv_up.subtitle %} {% include '_header.html' %} {% endwith %} - - {% if not mainte_csv_up.is_verified %} - - {% endif %}
@@ -114,7 +105,7 @@ {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} {{mainte_csv_up.csv_file_name}} {% else %} - + {% endif %} @@ -127,7 +118,7 @@ {% else %} - + {% endif %}