feat: レビュー指摘対応

This commit is contained in:
高木要 2023-07-18 14:13:13 +09:00
parent 3d9ffc6689
commit 74644622fe
9 changed files with 127 additions and 119 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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}")

View File

@ -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

View File

@ -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,

View File

@ -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;
}

View File

@ -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 = 'ダミーテーブル'

View File

@ -4,7 +4,6 @@
{% with subtitle = mainte_csv_up.subtitle %}
{% include '_header.html' %}
{% endwith %}
<!-- TODO: CSS変える -->
<link href="/static/css/masterMainte.css" rel="stylesheet" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript">
@ -24,14 +23,6 @@
}
</script>
{% if not mainte_csv_up.is_verified %}
<script type="text/javascript">
window.onload = function(){
// ボタン、テキストボックス初期化
formInsertBtDisabled();
};
</script>
{% endif %}
</head>
<body>
<!-- タイトルと上部ボタン -->
@ -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 %}
<input type="file" id="excelFile" size="50" name="ctrl_csv_file" accept=".csv" onchange="formInsertBtDisabled()">
<input type="file" id="csvFile" size="50" name="ctrl_csv_file" accept=".csv" onchange="formInsertBtDisabled()">
{% endif %}
</td>
<!-- ボタン -->
@ -127,7 +118,7 @@
<input class="buttonSize" id="insert" name="insert_bt" value="登録" type="submit">
{% else %}
<input name="btName" value="input_bt" type="hidden">
<input class="buttonSize" id="confirm" name="input_bt" value="確認" type="submit">
<input class="buttonSize" id="confirm" name="input_bt" value="確認" type="submit" disabled>
{% endif %}
</td>
</tr>