From 5d9b69298280ef05f76c1ad73947997632a54135 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 2 Apr 2024 15:42:02 +0900 Subject: [PATCH 01/34] =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=83=AD=E3=83=83=E3=82=AF=E3=82=A2=E3=82=A6=E3=83=88?= =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 11 ++++++ ecs/jskult-webapp/src/model/db/user_master.py | 2 + .../repositories/user_master_repository.py | 39 +++++++++++++++++++ .../src/services/login_service.py | 6 +++ ecs/jskult-webapp/src/system_var/constants.py | 7 +++- 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 5c8d904e..c9555df7 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -66,10 +66,21 @@ def login( request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) ): + # ユーザーマスタ検索 + pre_login_user_record = login_service.logged_in_user(request.username) + # ログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする + if pre_login_user_record is not None and pre_login_user_record.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT: + logger.info(f'ログイン失敗回数が10回以上: {request.username}') + # ユーザーが有効の場合、DBにアカウント無効にする + if pre_login_user_record.enabled_flg == 'Y': + login_service.on_retry_limit_exceeded(request.username) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_RETRY_LIMIT_EXCEEDED) + try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: logger.info(f'ログイン失敗:{e}') + login_service.incorrect_login_password_attempt(request.username) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: logger.info(f'ログイン失敗:{e}') diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 913b415e..8e5fb2ad 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -25,6 +25,8 @@ class UserMasterModel(BaseDBModel): updater: Optional[str] update_date: Optional[datetime] mntuser_flg: Optional[str] + mntuser_login_failed_cnt: Optional[int] + mntuser_last_login_failed_datetime: Optional[datetime] def is_enable_user(self): return self.enabled_flg == 'Y' diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 7edde00a..3a4316d8 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -26,3 +26,42 @@ class UserMasterRepository(BaseRepository): except Exception as e: logger.exception(f"DB Error : Exception={e}") raise e + + def increase_login_retry_count(self, parameter: dict) -> UserMasterModel: + try: + query = """\ + UPDATE + src05.user_mst + SET + mntuser_login_failed_cnt = + CASE + WHEN DATE(mntuser_last_login_failed_datetime) = CURRENT_DATE() THEN mntuser_login_failed_cnt + 1 + ELSE 1 + END, + mntuser_last_login_failed_datetime = CURRENT_DATE() + WHERE + user_id = :user_id + AND + mntuser_flg = 1;\ + """ + self._database.execute(query, parameter) + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e + + def disable_mnt_user(self, parameter: dict) -> UserMasterModel: + try: + query = """\ + UPDATE + src05.user_mst + SET + enabled_flg = 'N' + WHERE + user_id = :user_id + AND + mntuser_flg = 1\ + """ + self._database.execute(query, parameter) + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e \ No newline at end of file diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index aa1f37fd..12fa05f4 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -49,6 +49,12 @@ class LoginService(BaseService): user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) return user_record + def incorrect_login_password_attempt(self, user_id: str): + self.user_repository.increase_login_retry_count({'user_id': user_id}) + + def on_retry_limit_exceeded(self, user_id: str): + self.user_repository.disable_mnt_user({'user_id': user_id}) + def __secret_hash(self, username: str): # see - https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/ # noqa message = bytes(username + environment.COGNITO_CLIENT_ID, 'utf-8') diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 3756facb..8758d585 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -63,6 +63,7 @@ LOGOUT_REASON_BACKUP_PROCESSING = 'dump_processing' LOGOUT_REASON_NOT_LOGIN = 'not_login' LOGOUT_REASON_DB_ERROR = 'db_error' LOGOUT_REASON_UNEXPECTED = 'unexpected' +LOGOUT_REASON_RETRY_LIMIT_EXCEEDED = 'retry_limit_exceeded' LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_DO_LOGOUT: 'Logoutしました。', @@ -72,7 +73,8 @@ LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_BACKUP_PROCESSING: 'バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテは使用できません', LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。', LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。', - LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。' + LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。', + LOGOUT_REASON_RETRY_LIMIT_EXCEEDED: 'ログイン失敗回数の上限を超えましたので
アカウントをロックしました。
管理者に連絡してください' } # 新規施設担当者登録CSV(マスターメンテ) @@ -207,3 +209,6 @@ DISPLAY_USER_STOP_DIV_SHORT = { '03': '特定項目停止', '04': '全DM停止' } + +# ログイン失敗回数上限(保守ユーザー) +LOGIN_FAIL_LIMIT = 10 \ No newline at end of file From 4270582d7abfdee89dc04aa1d01ddadc8a22b14e Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 2 Apr 2024 17:50:50 +0900 Subject: [PATCH 02/34] =?UTF-8?q?=E5=91=BD=E5=90=8D=E6=8C=87=E6=91=98?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=83=BB=E6=9C=89=E5=8A=B9=E3=83=95=E3=83=A9?= =?UTF-8?q?=E3=82=B0=E5=88=A4=E5=AE=9A=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 8 +++----- ecs/jskult-webapp/src/model/db/user_master.py | 5 ++++- .../src/repositories/user_master_repository.py | 4 ++-- ecs/jskult-webapp/src/services/login_service.py | 4 ++-- ecs/jskult-webapp/src/system_var/constants.py | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index c9555df7..6eee5b31 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,12 +69,10 @@ def login( # ユーザーマスタ検索 pre_login_user_record = login_service.logged_in_user(request.username) # ログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする - if pre_login_user_record is not None and pre_login_user_record.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT: + if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): logger.info(f'ログイン失敗回数が10回以上: {request.username}') - # ユーザーが有効の場合、DBにアカウント無効にする - if pre_login_user_record.enabled_flg == 'Y': - login_service.on_retry_limit_exceeded(request.username) - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_RETRY_LIMIT_EXCEEDED) + login_service.on_login_fail_limit_exceeded(request.username) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) try: jwt_token = login_service.login(request.username, request.password) diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 8e5fb2ad..b8dee115 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import Optional from src.model.db.base_db_model import BaseDBModel - +from src.system_var import constants class UserMasterModel(BaseDBModel): user_id: Optional[str] @@ -36,3 +36,6 @@ class UserMasterModel(BaseDBModel): def is_groupware_user(self): return self.mntuser_flg == '0' or self.mntuser_flg is None + + def is_login_failed_limit_exceeded(self): + return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 3a4316d8..0516ec79 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -27,7 +27,7 @@ class UserMasterRepository(BaseRepository): logger.exception(f"DB Error : Exception={e}") raise e - def increase_login_retry_count(self, parameter: dict) -> UserMasterModel: + def increase_login_failed_count(self, parameter: dict) -> UserMasterModel: try: query = """\ UPDATE @@ -38,7 +38,7 @@ class UserMasterRepository(BaseRepository): WHEN DATE(mntuser_last_login_failed_datetime) = CURRENT_DATE() THEN mntuser_login_failed_cnt + 1 ELSE 1 END, - mntuser_last_login_failed_datetime = CURRENT_DATE() + mntuser_last_login_failed_datetime = CURRENT_TIMESTAMP() WHERE user_id = :user_id AND diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index 12fa05f4..ded8b7b7 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -50,9 +50,9 @@ class LoginService(BaseService): return user_record def incorrect_login_password_attempt(self, user_id: str): - self.user_repository.increase_login_retry_count({'user_id': user_id}) + self.user_repository.increase_login_failed_count({'user_id': user_id}) - def on_retry_limit_exceeded(self, user_id: str): + def on_login_fail_limit_exceeded(self, user_id: str): self.user_repository.disable_mnt_user({'user_id': user_id}) def __secret_hash(self, username: str): diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 8758d585..6422fdd5 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -63,7 +63,7 @@ LOGOUT_REASON_BACKUP_PROCESSING = 'dump_processing' LOGOUT_REASON_NOT_LOGIN = 'not_login' LOGOUT_REASON_DB_ERROR = 'db_error' LOGOUT_REASON_UNEXPECTED = 'unexpected' -LOGOUT_REASON_RETRY_LIMIT_EXCEEDED = 'retry_limit_exceeded' +LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED = 'retry_limit_exceeded' LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_DO_LOGOUT: 'Logoutしました。', @@ -74,7 +74,7 @@ LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。', LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。', LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。', - LOGOUT_REASON_RETRY_LIMIT_EXCEEDED: 'ログイン失敗回数の上限を超えましたので
アカウントをロックしました。
管理者に連絡してください' + LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED: 'ログイン失敗回数の上限を超えましたので
アカウントをロックしました。
管理者に連絡してください' } # 新規施設担当者登録CSV(マスターメンテ) From 000e9c006fccbbb2f8e65a80c18097506d9021ef Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 3 Apr 2024 10:57:54 +0900 Subject: [PATCH 03/34] =?UTF-8?q?=E4=BB=95=E6=A7=98=E3=81=AB=E5=90=88?= =?UTF-8?q?=E3=82=8F=E3=81=9B=E3=81=A6=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 10 +++++++--- ecs/jskult-webapp/src/model/db/user_master.py | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 6eee5b31..f2c44559 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -70,8 +70,8 @@ def login( pre_login_user_record = login_service.logged_in_user(request.username) # ログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): - logger.info(f'ログイン失敗回数が10回以上: {request.username}') - login_service.on_login_fail_limit_exceeded(request.username) + logger.info(f'ログイン失敗回数が10回以上: {pre_login_user_record.user_id}') + login_service.incorrect_login_password_attempt(pre_login_user_record.user_id) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) try: @@ -79,7 +79,11 @@ def login( except NotAuthorizeException as e: logger.info(f'ログイン失敗:{e}') login_service.incorrect_login_password_attempt(request.username) - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + if pre_login_user_record is not None and pre_login_user_record.is_on_login_failed_limit(): + login_service.on_login_fail_limit_exceeded(pre_login_user_record.user_id) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) + else: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: logger.info(f'ログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index b8dee115..711fe366 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -39,3 +39,6 @@ class UserMasterModel(BaseDBModel): def is_login_failed_limit_exceeded(self): return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT + + def is_on_login_failed_limit(self): + return self.mntuser_login_failed_cnt == constants.LOGIN_FAIL_LIMIT - 1 \ No newline at end of file From 7a65e2b46ea448fc0c1d2f6091b0cb885e097327 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 3 Apr 2024 16:05:41 +0900 Subject: [PATCH 04/34] =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 12 +++++++----- ecs/jskult-webapp/src/services/login_service.py | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index f2c44559..d64a80fd 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -71,19 +71,21 @@ def login( # ログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): logger.info(f'ログイン失敗回数が10回以上: {pre_login_user_record.user_id}') - login_service.incorrect_login_password_attempt(pre_login_user_record.user_id) + login_service.increase_login_failed_count(pre_login_user_record.user_id) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: logger.info(f'ログイン失敗:{e}') - login_service.incorrect_login_password_attempt(request.username) - if pre_login_user_record is not None and pre_login_user_record.is_on_login_failed_limit(): + login_service.increase_login_failed_count(request.username) + + # pre_login_user_recordのデータ更新 + pre_login_user_record = login_service.logged_in_user(request.username) + if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): login_service.on_login_fail_limit_exceeded(pre_login_user_record.user_id) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) - else: - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: logger.info(f'ログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index ded8b7b7..ae7849b0 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -49,7 +49,7 @@ class LoginService(BaseService): user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) return user_record - def incorrect_login_password_attempt(self, user_id: str): + def increase_login_failed_count(self, user_id: str): self.user_repository.increase_login_failed_count({'user_id': user_id}) def on_login_fail_limit_exceeded(self, user_id: str): diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 6422fdd5..962ed7d6 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -63,7 +63,7 @@ LOGOUT_REASON_BACKUP_PROCESSING = 'dump_processing' LOGOUT_REASON_NOT_LOGIN = 'not_login' LOGOUT_REASON_DB_ERROR = 'db_error' LOGOUT_REASON_UNEXPECTED = 'unexpected' -LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED = 'retry_limit_exceeded' +LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED = 'login_failed_limit_exceeded' LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_DO_LOGOUT: 'Logoutしました。', From fa3100b830e74a085ae3524566e814feec1eb71f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 3 Apr 2024 16:20:18 +0900 Subject: [PATCH 05/34] =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/user_master.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 711fe366..5c58cddb 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -38,7 +38,4 @@ class UserMasterModel(BaseDBModel): return self.mntuser_flg == '0' or self.mntuser_flg is None def is_login_failed_limit_exceeded(self): - return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT - - def is_on_login_failed_limit(self): - return self.mntuser_login_failed_cnt == constants.LOGIN_FAIL_LIMIT - 1 \ No newline at end of file + return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT \ No newline at end of file From ac5cfc4d0f8eecd12ad65707737b61f91e7e443e Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 3 Apr 2024 17:16:08 +0900 Subject: [PATCH 06/34] =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E5=88=A4=E5=AE=9A=E3=83=AD=E3=82=B8=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=AF=E3=83=A9=E3=82=B9=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 17 ++++++----------- ecs/jskult-webapp/src/model/db/user_master.py | 6 +----- ecs/jskult-webapp/src/services/login_service.py | 8 +++++++- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index d64a80fd..153156f8 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -66,12 +66,10 @@ def login( request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) ): - # ユーザーマスタ検索 - pre_login_user_record = login_service.logged_in_user(request.username) - # ログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする - if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): - logger.info(f'ログイン失敗回数が10回以上: {pre_login_user_record.user_id}') - login_service.increase_login_failed_count(pre_login_user_record.user_id) + # ログイン成功問わず、DBのログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする + if login_service.is_login_failed_limit_exceeded(request.username): + logger.info(f'ログイン失敗回数が10回以上: {request.username}') + login_service.increase_login_failed_count(request.username) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) try: @@ -79,11 +77,8 @@ def login( except NotAuthorizeException as e: logger.info(f'ログイン失敗:{e}') login_service.increase_login_failed_count(request.username) - - # pre_login_user_recordのデータ更新 - pre_login_user_record = login_service.logged_in_user(request.username) - if pre_login_user_record is not None and pre_login_user_record.is_login_failed_limit_exceeded(): - login_service.on_login_fail_limit_exceeded(pre_login_user_record.user_id) + if login_service.is_login_failed_limit_exceeded(request.username): + login_service.on_login_fail_limit_exceeded(request.username) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 5c58cddb..879cd008 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -2,7 +2,6 @@ from datetime import datetime from typing import Optional from src.model.db.base_db_model import BaseDBModel -from src.system_var import constants class UserMasterModel(BaseDBModel): user_id: Optional[str] @@ -35,7 +34,4 @@ class UserMasterModel(BaseDBModel): return self.mntuser_flg == '1' def is_groupware_user(self): - return self.mntuser_flg == '0' or self.mntuser_flg is None - - def is_login_failed_limit_exceeded(self): - return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT \ No newline at end of file + return self.mntuser_flg == '0' or self.mntuser_flg is None \ No newline at end of file diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index ae7849b0..fa75b5bf 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -11,7 +11,7 @@ from src.repositories.base_repository import BaseRepository from src.repositories.user_master_repository import UserMasterRepository from src.services.base_service import BaseService from src.system_var import environment - +from src.system_var import constants class LoginService(BaseService): REPOSITORIES = { @@ -55,6 +55,12 @@ class LoginService(BaseService): def on_login_fail_limit_exceeded(self, user_id: str): self.user_repository.disable_mnt_user({'user_id': user_id}) + def is_login_failed_limit_exceeded(self, user_id: str): + user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) + if user_record is None: + return False + return user_record.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT + def __secret_hash(self, username: str): # see - https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/ # noqa message = bytes(username + environment.COGNITO_CLIENT_ID, 'utf-8') From 05c120b56e9f8aa5e181cb792904f391a345d997 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Apr 2024 09:58:04 +0900 Subject: [PATCH 07/34] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E6=97=A5=E6=AC=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 36 ++++++++++++------- .../src/batch/laundering/sales_laundering.py | 9 ++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 85de15ed..df20ea05 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -1,4 +1,5 @@ from datetime import datetime, timedelta + from src.batch.batch_functions import logging_sql from src.batch.common.batch_context import BatchContext from src.db.database import Database @@ -120,12 +121,13 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict logger.info('納入先処方元マスタの登録 終了') -def _select_emp_chg_inst_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: - # 従業員担当施設マスタから、DCF施設コードに対応した領域コードの取得 +def _select_primary_key_from_emp_chg_inst(db: Database, dcf_inst_cd: str) -> list[dict]: + # 従業員担当施設マスタから、DCF施設コードに対応した領域コードと担当者種別コードの取得 try: sql = """ SELECT - ta_cd + ta_cd, + emp_chg_type_cd FROM src05.emp_chg_inst WHERE @@ -134,14 +136,14 @@ def _select_emp_chg_inst_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date """ params = {'dcf_inst_cd': dcf_inst_cd} - emp_chg_inst_ta_cd_records = db.execute_select(sql, params) + emp_chg_inst_primary_key_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('従業員担当施設マスタから領域コードの取得に成功') except Exception as e: logger.debug('従業員担当施設マスタから領域コードの取得に失敗') raise e - return emp_chg_inst_ta_cd_records + return emp_chg_inst_primary_key_records def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): @@ -149,10 +151,10 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): logger.info('従業員担当施設マスタの登録 開始') for enabled_merge_record in enabled_dst_inst_merge_records: tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) - emp_chg_inst_ta_cd_records = _select_emp_chg_inst_ta_cd(db, enabled_merge_record['dcf_inst_cd']) - for emp_chg_inst_ta_cd_record in emp_chg_inst_ta_cd_records: + emp_chg_inst_primary_key_records = _select_primary_key_from_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd']) + for emp_chg_inst_primary_key_record in emp_chg_inst_primary_key_records: emp_chg_inst_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd'], - emp_chg_inst_ta_cd_record['ta_cd']) + emp_chg_inst_primary_key_record['ta_cd'], emp_chg_inst_primary_key_record['emp_chg_type_cd']) for emp_chg_inst_row in emp_chg_inst_records: # 重複時相手先コードが存在したかのチェック if emp_chg_inst_row['opp_count'] > 0: @@ -173,7 +175,7 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): emp_chg_inst_row) continue # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する - _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], + _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], emp_chg_inst_row['emp_chg_type_cd'], emp_chg_inst_row['start_date']) logger.info('従業員担当施設マスタの登録 終了') @@ -207,7 +209,7 @@ def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: raise e -def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): +def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, emp_chg_type_cd: str, start_date: str): # emp_chg_instをUPDATE try: elapsed_time = ElapsedTime() @@ -221,9 +223,10 @@ def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, st WHERE inst_cd = :dcf_inst_cd AND ta_cd = :ta_cd + AND emp_chg_type_cd = :emp_chg_type_cd AND start_date = :start_date """ - params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'start_date': start_date} + params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'emp_chg_type_cd': emp_chg_type_cd, 'start_date': start_date} res = db.execute(sql, params) logging_sql(logger, sql) logger.info(f'従業員担当施設マスタのYorNフラグ更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') @@ -246,6 +249,7 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: WHERE inst_cd = :dcf_inst_cd AND ta_cd = :ta_cd + AND emp_chg_type_cd = :emp_chg_type_cd AND emp_cd = :emp_cd AND bu_cd = :bu_cd AND start_date = :start_date @@ -254,6 +258,7 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: 'end_date': last_end_date, 'dcf_inst_cd': dcf_inst_cd, 'ta_cd': emp_chg_inst_row['ta_cd'], + 'emp_chg_type_cd': emp_chg_inst_row['emp_chg_type_cd'], 'emp_cd': emp_chg_inst_row['emp_cd'], 'bu_cd': emp_chg_inst_row['bu_cd'], 'start_date': emp_chg_inst_row['start_date'] @@ -276,6 +281,7 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, src05.emp_chg_inst( inst_cd, ta_cd, + emp_chg_type_cd, emp_cd, bu_cd, start_date, @@ -290,6 +296,7 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, VALUES( :dup_opp_cd, :ta_cd, + :emp_chg_type_cd, :emp_cd, :bu_cd, :start_date, @@ -305,6 +312,7 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, params = { 'dup_opp_cd': dup_opp_cd, 'ta_cd': emp_chg_inst_row['ta_cd'], + 'emp_chg_type_cd': emp_chg_inst_row['emp_chg_type_cd'], 'emp_cd': emp_chg_inst_row['emp_cd'], 'bu_cd': emp_chg_inst_row['bu_cd'], 'start_date': set_start_date, @@ -518,13 +526,14 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, raise e -def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: +def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str, emp_chg_type_cd: str) -> list[dict]: # emp_chg_instからSELECT try: sql = """ SELECT eci.inst_cd, eci.ta_cd, + eci.emp_chg_type_cd, eci.emp_cd, eci.bu_cd, eci.start_date, @@ -545,10 +554,11 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: WHERE eci.inst_cd = :dcf_inst_cd AND eci.ta_cd = :ta_cd + AND eci.emp_chg_type_cd = :emp_chg_type_cd AND eci.enabled_flg = 'Y' AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < eci.end_date """ - params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd} + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd, 'emp_chg_type_cd': emp_chg_type_cd} emp_chg_inst_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('従業員担当施設マスタの取得 成功') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py index 2cc530f9..8a25ae76 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -1,8 +1,9 @@ from src.batch.common.batch_context import BatchContext -from src.batch.laundering import ( - create_inst_merge_for_laundering, emp_chg_inst_laundering, - ult_ident_presc_laundering, sales_results_laundering) from src.batch.dcf_inst_merge import integrate_dcf_inst_merge +from src.batch.laundering import (create_inst_merge_for_laundering, + emp_chg_inst_laundering, + sales_results_laundering, + ult_ident_presc_laundering) from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() @@ -18,7 +19,7 @@ def exec(): logger.info('営業日ではないため、実績洗替処理をスキップします。') return # DCF施設統合マスタ日次更新 - integrate_dcf_inst_merge.exec() + integrate_dcf_inst_merge.exec() # 洗替用マスタ作成 create_inst_merge_for_laundering.exec() # 施設担当者洗替 From 1a218c6861c1c096fae2ba4a72d3318778888ac2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Apr 2024 09:59:23 +0900 Subject: [PATCH 08/34] =?UTF-8?q?feat:=20=E6=96=BD=E8=A8=AD=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E3=83=9E=E3=82=B9=E3=82=BF=E6=B4=97=E6=9B=BF?= =?UTF-8?q?=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/emp_chg_inst_laundering.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 8ec3b84e..51680d2e 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -53,7 +53,9 @@ def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): src05.emp_chg_inst_lau SELECT inst_cd, - ta_cd,emp_cd, + ta_cd, + emp_chg_type_cd, + emp_cd, bu_cd, start_date, end_date, From cfdac2b9f424a5c9e3d534b2dfdcd9f2ed93a085 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 4 Apr 2024 10:08:08 +0900 Subject: [PATCH 09/34] =?UTF-8?q?SQL=E6=9B=B4=E6=96=B0=E3=83=AD=E3=82=B8?= =?UTF-8?q?=E3=83=83=E3=82=AF=E5=A4=89=E6=9B=B4=E3=83=BB=E5=A4=B1=E6=95=97?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/user_master.py | 6 +++++- .../src/repositories/user_master_repository.py | 10 ++++++++-- ecs/jskult-webapp/src/services/login_service.py | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 879cd008..d86253ae 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -2,6 +2,7 @@ from datetime import datetime from typing import Optional from src.model.db.base_db_model import BaseDBModel +from src.system_var import constants class UserMasterModel(BaseDBModel): user_id: Optional[str] @@ -34,4 +35,7 @@ class UserMasterModel(BaseDBModel): return self.mntuser_flg == '1' def is_groupware_user(self): - return self.mntuser_flg == '0' or self.mntuser_flg is None \ No newline at end of file + return self.mntuser_flg == '0' or self.mntuser_flg is None + + def is_login_failed_limit_exceeded(self): + return self.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT \ No newline at end of file diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 0516ec79..dcb10aa9 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -35,8 +35,14 @@ class UserMasterRepository(BaseRepository): SET mntuser_login_failed_cnt = CASE - WHEN DATE(mntuser_last_login_failed_datetime) = CURRENT_DATE() THEN mntuser_login_failed_cnt + 1 - ELSE 1 + WHEN + DATE(mntuser_last_login_failed_datetime) = CURRENT_DATE() + OR + mntuser_login_failed_cnt >= 10 + THEN + mntuser_login_failed_cnt + 1 + ELSE + 1 END, mntuser_last_login_failed_datetime = CURRENT_TIMESTAMP() WHERE diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index fa75b5bf..2ea0724a 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -59,7 +59,7 @@ class LoginService(BaseService): user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) if user_record is None: return False - return user_record.mntuser_login_failed_cnt >= constants.LOGIN_FAIL_LIMIT + return user_record.is_login_failed_limit_exceeded() def __secret_hash(self, username: str): # see - https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/ # noqa From 4d09f9973a02dd14ab1012f96d4db6b28ac6099d Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 4 Apr 2024 16:41:54 +0900 Subject: [PATCH 10/34] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AADB=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=87=A6=E7=90=86=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 153156f8..6d0e5343 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,7 +69,6 @@ def login( # ログイン成功問わず、DBのログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする if login_service.is_login_failed_limit_exceeded(request.username): logger.info(f'ログイン失敗回数が10回以上: {request.username}') - login_service.increase_login_failed_count(request.username) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) try: From fb04d6fc4846e834c95898769b0934754768b52f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 4 Apr 2024 16:53:43 +0900 Subject: [PATCH 11/34] =?UTF-8?q?10=E5=9B=9E=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=A4=B1=E6=95=97=E5=88=A4=E5=AE=9A=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 6d0e5343..99f4a389 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -66,11 +66,6 @@ def login( request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) ): - # ログイン成功問わず、DBのログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする - if login_service.is_login_failed_limit_exceeded(request.username): - logger.info(f'ログイン失敗回数が10回以上: {request.username}') - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) - try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: @@ -84,6 +79,11 @@ def login( logger.info(f'ログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) + # ログイン成功問わず、DBのログイン失敗回数が10回以上あれば、ログアウト画面にリダイレクトする + if login_service.is_login_failed_limit_exceeded(request.username): + logger.info(f'ログイン失敗回数が10回以上: {request.username}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) + verified_token = jwt_token.verify_token() # 普通の認証だと、`cognito:username`に入る。 user_id = verified_token.user_id From eb7d8bfb3914e25f02520d6e3913ac0d7e49b27c Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 9 Apr 2024 14:10:28 +0900 Subject: [PATCH 12/34] =?UTF-8?q?=E6=97=A5=E4=BB=98=E8=A8=98=E9=8C=B2GMT?= =?UTF-8?q?=EF=BC=8B9=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/repositories/user_master_repository.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index dcb10aa9..51a9935f 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -36,7 +36,7 @@ class UserMasterRepository(BaseRepository): mntuser_login_failed_cnt = CASE WHEN - DATE(mntuser_last_login_failed_datetime) = CURRENT_DATE() + DATE(mntuser_last_login_failed_datetime) = DATE(CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo')) OR mntuser_login_failed_cnt >= 10 THEN @@ -44,7 +44,7 @@ class UserMasterRepository(BaseRepository): ELSE 1 END, - mntuser_last_login_failed_datetime = CURRENT_TIMESTAMP() + mntuser_last_login_failed_datetime = CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo') WHERE user_id = :user_id AND From e06d88b747909085ca2c33d8cd89e5c71421213a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 10 Apr 2024 09:37:55 +0900 Subject: [PATCH 13/34] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index df20ea05..3a1401da 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -138,9 +138,9 @@ def _select_primary_key_from_emp_chg_inst(db: Database, dcf_inst_cd: str) -> lis params = {'dcf_inst_cd': dcf_inst_cd} emp_chg_inst_primary_key_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('従業員担当施設マスタから領域コードの取得に成功') + logger.info('従業員担当施設マスタから領域コード、担当者種別コードの取得に成功') except Exception as e: - logger.debug('従業員担当施設マスタから領域コードの取得に失敗') + logger.debug('従業員担当施設マスタから領域コード、担当者種別コードの取得に失敗') raise e return emp_chg_inst_primary_key_records From 166dde48488d26d48a0275e4a8b1c3f4ac118ce6 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 11 Apr 2024 09:06:18 +0900 Subject: [PATCH 14/34] =?UTF-8?q?=E4=BB=95=E6=A7=98=E3=81=AB=E5=90=88?= =?UTF-8?q?=E3=82=8F=E3=81=9B=E3=81=A6=E6=9D=A1=E4=BB=B6=E9=A0=86=E5=93=A1?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/repositories/user_master_repository.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 51a9935f..3024afe0 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -37,8 +37,6 @@ class UserMasterRepository(BaseRepository): CASE WHEN DATE(mntuser_last_login_failed_datetime) = DATE(CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo')) - OR - mntuser_login_failed_cnt >= 10 THEN mntuser_login_failed_cnt + 1 ELSE From a7bc502f364cf2ea95e5882a00acb7e9208d8baf Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 15 Apr 2024 08:56:26 +0900 Subject: [PATCH 15/34] =?UTF-8?q?=E4=B8=AD=E9=80=94=E3=83=97=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 12 ++++++++++++ .../src/repositories/emp_chg_inst_repository.py | 2 ++ ecs/jskult-webapp/src/system_var/constants.py | 15 +++++++++------ 3 files changed, 23 insertions(+), 6 deletions(-) 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 e288ce3a..619e736e 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -57,6 +57,8 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list.extend(self.check_require()) # 施設コード存在チェック error_list.extend(self.check_inst_cd_exists()) + # 担当者種別コード存在チェック + error_list.extend(self.check_emp_chg_type_cd_exists()) # MUID存在チェック error_list.extend(self.check_emp_cd_exists()) # BuCd存在チェック @@ -160,6 +162,12 @@ class MasterMainteCSVItem(metaclass=ABCMeta): pass ... + @abstractmethod + def check_emp_chg_type_cd_exists(self) -> list[str]: + """担当者種別コード存在チェック""" + pass + ... + @abstractmethod def check_emp_cd_exists(self) -> list[str]: """MUID存在チェック""" @@ -219,6 +227,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): 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_chg_type_cd = super().get_csv_value(constants.CSV_NEW_EMP_CHG_TYPE_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) @@ -240,6 +249,9 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO])) + if len(self.emp_chg_type_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO])) if len(self.bu_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO])) 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 d91be694..07dcf34c 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -28,6 +28,7 @@ class EmpChgInstRepository(BaseRepository): ( inst_cd, ta_cd, + emp_chg_type_cd, emp_cd, bu_cd, start_date, @@ -42,6 +43,7 @@ class EmpChgInstRepository(BaseRepository): VALUES ( :inst_cd, :ta_cd, + :emp_chg_type_cd, :emp_cd, :bu_cd, :start_date, diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 3756facb..f592f370 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -80,6 +80,7 @@ NEW_INST_EMP_CSV_LOGICAL_NAMES = [ '施設コード', '施設名', '領域コード', + '担当者種別コード', 'MUID', '担当者名(姓)', '担当者名(名)', @@ -93,18 +94,20 @@ CSV_NEW_INST_CD_COL_NO = 0 CSV_NEW_INST_NAME_COL_NO = 1 # 領域コードの列No CSV_NEW_TA_CD_COL_NO = 2 +# 担当者種別コードの列No +CSV_NEW_EMP_CHG_TYPE_CD_COL_NO = 3 # MUIDの列No -CSV_NEW_EMP_CD_COL_NO = 3 +CSV_NEW_EMP_CD_COL_NO = 4 # 担当者名(姓)の列No -CSV_NEW_EMP_NAME_FAMILY_COL_NO = 4 +CSV_NEW_EMP_NAME_FAMILY_COL_NO = 5 # 担当者名(名)の列No -CSV_NEW_EMP_NAME_FIRST_COL_NO = 5 +CSV_NEW_EMP_NAME_FIRST_COL_NO = 6 # ビジネスユニットコードの列No -CSV_NEW_BU_CD_COL_NO = 6 +CSV_NEW_BU_CD_COL_NO = 7 # 適用開始日の列No -CSV_NEW_START_DATE = 7 +CSV_NEW_START_DATE = 8 # 適用終了日の列No -CSV_NEW_END_DATE = 8 +CSV_NEW_END_DATE = 9 # 施設担当者変更登録CSV(マスターメンテ) CHANGE_INST_CSV_LOGICAL_NAMES = [ From db0e28db3e07c3060e1ba1f53c5efea77dd7f7be Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 15 Apr 2024 15:29:10 +0900 Subject: [PATCH 16/34] =?UTF-8?q?fix:=20=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=82=B9=E3=82=BF=E6=9B=B4=E6=96=B0=E6=99=82?= =?UTF-8?q?=E3=81=AE=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=BE=E3=83=BC=E3=83=B3?= =?UTF-8?q?=E3=82=92JST=E3=81=AB=E5=A4=89=E6=9B=B4=EF=BC=88=E5=85=B1?= =?UTF-8?q?=E9=80=9A=E9=96=A2=E6=95=B0=E3=82=92=E4=BD=BF=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 2 + ecs/jskult-webapp/src/db/database.py | 4 +- .../repositories/user_master_repository.py | 43 ++++++++++++------- .../src/services/login_service.py | 13 +++++- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 99f4a389..9b2c808e 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -70,7 +70,9 @@ def login( jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: logger.info(f'ログイン失敗:{e}') + # ログイン失敗回数をカウント login_service.increase_login_failed_count(request.username) + # ログイン失敗回数を超過した場合はメッセージを変える if login_service.is_login_failed_limit_exceeded(request.username): login_service.on_login_fail_limit_exceeded(request.username) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index c729faf5..7dab8455 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -189,7 +189,9 @@ class DatabaseClient: self.__session = None def to_jst(self): - self.execute('SET time_zone = "+9:00"') + # self.session.begin() + self.execute('SET SESSION time_zone = "Asia/Tokyo"') + # self.session.commit() def __execute_with_transaction(self, query: str, parameters: dict): # トランザクションを開始してクエリを実行する diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 3024afe0..3acbc105 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -6,6 +6,19 @@ logger = get_logger('ユーザー取得') class UserMasterRepository(BaseRepository): + + def to_jst(self): + self._database.to_jst() + + def begin(self): + self._database.begin() + + def commit(self): + self._database.commit() + + def rollback(self): + self._database.rollback() + FETCH_SQL = """\ SELECT * @@ -30,29 +43,29 @@ class UserMasterRepository(BaseRepository): def increase_login_failed_count(self, parameter: dict) -> UserMasterModel: try: query = """\ - UPDATE - src05.user_mst - SET - mntuser_login_failed_cnt = - CASE - WHEN - DATE(mntuser_last_login_failed_datetime) = DATE(CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo')) - THEN + UPDATE + src05.user_mst + SET + mntuser_login_failed_cnt = + CASE + WHEN + DATE(mntuser_last_login_failed_datetime) = DATE(CURRENT_TIMESTAMP()) + THEN mntuser_login_failed_cnt + 1 - ELSE + ELSE 1 - END, - mntuser_last_login_failed_datetime = CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo') - WHERE + END, + mntuser_last_login_failed_datetime = CURRENT_TIMESTAMP() + WHERE user_id = :user_id - AND + AND mntuser_flg = 1;\ """ self._database.execute(query, parameter) except Exception as e: logger.exception(f"DB Error : Exception={e}") raise e - + def disable_mnt_user(self, parameter: dict) -> UserMasterModel: try: query = """\ @@ -68,4 +81,4 @@ class UserMasterRepository(BaseRepository): self._database.execute(query, parameter) except Exception as e: logger.exception(f"DB Error : Exception={e}") - raise e \ No newline at end of file + raise e diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index 2ea0724a..3a2715b2 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -11,7 +11,7 @@ from src.repositories.base_repository import BaseRepository from src.repositories.user_master_repository import UserMasterRepository from src.services.base_service import BaseService from src.system_var import environment -from src.system_var import constants + class LoginService(BaseService): REPOSITORIES = { @@ -50,7 +50,16 @@ class LoginService(BaseService): return user_record def increase_login_failed_count(self, user_id: str): - self.user_repository.increase_login_failed_count({'user_id': user_id}) + + try: + # セッション内のタイムゾーン変更のため、明示的にトランザクションを開始する + self.user_repository.begin() + self.user_repository.to_jst() + self.user_repository.increase_login_failed_count({'user_id': user_id}) + self.user_repository.commit() + except Exception as e: + self.user_repository.rollback() + raise e def on_login_fail_limit_exceeded(self, user_id: str): self.user_repository.disable_mnt_user({'user_id': user_id}) From 240945b8d5c975dbc4d71ce16bcfbbcf63852cdc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 15 Apr 2024 17:38:37 +0900 Subject: [PATCH 17/34] =?UTF-8?q?style:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/database.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 7dab8455..bd828db3 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -189,9 +189,7 @@ class DatabaseClient: self.__session = None def to_jst(self): - # self.session.begin() self.execute('SET SESSION time_zone = "Asia/Tokyo"') - # self.session.commit() def __execute_with_transaction(self, query: str, parameters: dict): # トランザクションを開始してクエリを実行する From 5acca202ace0cdd62f4ff3afffa3be6394aee1ea Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 15 Apr 2024 18:05:00 +0900 Subject: [PATCH 18/34] =?UTF-8?q?feat:=20=E6=96=BD=E8=A8=AD=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E3=83=9E=E3=82=B9=E3=82=BFCSV=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 2 +- .../src/model/request/master_mainte_csvdl.py | 12 ++++++++++-- .../src/repositories/emp_chg_inst_repository.py | 12 +++++++++--- ecs/jskult-webapp/src/system_var/constants.py | 2 ++ ecs/jskult-webapp/src/templates/instEmpCsvDL.html | 15 +++++++++++++-- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index e9d4ed14..4d130864 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -199,7 +199,7 @@ def new_inst_result_view( return templates_response -@ router.get('/instEmpCsvDL', response_class=HTMLResponse) +@router.get('/instEmpCsvDL', response_class=HTMLResponse) def inst_emp_csv_download_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py index 4155fa73..adcb7b68 100644 --- a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -2,20 +2,22 @@ from typing import Optional from fastapi import Form -from src.util.sanitize import sanitize - from src.model.request.request_base_model import RequestBaseModel +from src.util.sanitize import sanitize from src.util.string_util import is_not_empty @sanitize class MasterMainteCsvDlModel(RequestBaseModel): + # adaptは検索に使用するようの値 ta_cd: Optional[str] adapt_ta_cd: Optional[str] inst_cd: Optional[str] adapt_inst_cd: Optional[str] emp_cd: Optional[str] adapt_emp_cd: Optional[str] + emp_chg_type_cd: Optional[str] + adapt_emp_chg_type_cd: Optional[str] apply_date_from: Optional[str] adapt_apply_date_from: Optional[str] start_date_from: Optional[str] @@ -42,6 +44,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd: Optional[str] = Form(None), ctrl_inst_cd: Optional[str] = Form(None), ctrl_emp_cd: Optional[str] = Form(None), + ctrl_emp_chg_type_cd: Optional[str] = Form(None), ctrl_apply_date_from: Optional[str] = Form(None), ctrl_start_date_from: Optional[str] = Form(None), ctrl_start_date_to: Optional[str] = Form(None), @@ -58,6 +61,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd, ctrl_inst_cd, ctrl_emp_cd, + ctrl_emp_chg_type_cd, ctrl_apply_date_from, ctrl_start_date_from, ctrl_start_date_to, @@ -75,6 +79,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd: str, ctrl_inst_cd: str, ctrl_emp_cd: str, + ctrl_emp_chg_type_cd, ctrl_apply_date_from: str, ctrl_start_date_from: str, ctrl_start_date_to: str, @@ -89,6 +94,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd = ctrl_ta_cd if is_not_empty(ctrl_ta_cd) else '' ctrl_inst_cd = ctrl_inst_cd if is_not_empty(ctrl_inst_cd) else '' ctrl_emp_cd = ctrl_emp_cd if is_not_empty(ctrl_emp_cd) else '' + ctrl_emp_chg_type_cd = ctrl_emp_chg_type_cd if is_not_empty(ctrl_emp_chg_type_cd) else '' adapt_apply_date_from = '' if is_not_empty(ctrl_apply_date_from): @@ -147,6 +153,8 @@ class MasterMainteCsvDlModel(RequestBaseModel): adapt_inst_cd=ctrl_inst_cd, emp_cd=ctrl_emp_cd, adapt_emp_cd=ctrl_emp_cd, + emp_chg_type_cd=ctrl_emp_chg_type_cd, + adapt_emp_chg_type_cd=ctrl_emp_chg_type_cd, apply_date_from=ctrl_apply_date_from, adapt_apply_date_from=adapt_apply_date_from, start_date_from=ctrl_start_date_from, 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 d91be694..463a1cd6 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -1,10 +1,10 @@ -from src.repositories.base_repository import BaseRepository -from src.db.sql_condition import SQLCondition from src.db import sql_condition as condition +from src.db.sql_condition import SQLCondition +from src.logging.get_logger import get_logger from src.model.db.master_mente_count import MasterMenteCountModel from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty -from src.logging.get_logger import get_logger logger = get_logger('従業員担当施設マスタ') @@ -157,6 +157,7 @@ class EmpChgInstRepository(BaseRepository): eci.inst_cd AS inst_cd, mi.inst_name AS inst_name, eci.ta_cd AS ta_cd, + eci.emp_chg_type_cd AS emp_chg_type_cd, eci.emp_cd AS emp_cd, CONCAT(emp.emp_name_family, " ", emp.emp_name_first) AS emp_name_full, eci.bu_cd AS bu_cd, @@ -212,6 +213,11 @@ class EmpChgInstRepository(BaseRepository): parameter.adapt_emp_cd = f'%{parameter.emp_cd}%' where_clauses.append(SQLCondition('eci.emp_cd', condition.LIKE, 'adapt_emp_cd')) + # 担当者種別コードが入力されていた場合 + if is_not_empty(parameter.emp_chg_type_cd): + parameter.adapt_emp_chg_type_cd = f'%{parameter.emp_chg_type_cd}%' + where_clauses.append(SQLCondition('eci.emp_chg_type_cd', condition.LIKE, 'adapt_emp_chg_type_cd')) + # 適用期間内が入力されていた場合 if is_not_empty(parameter.adapt_apply_date_from): where_clauses.append(SQLCondition('eci.start_date', condition.LE, 'adapt_apply_date_from')) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 3756facb..e3738179 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -162,6 +162,7 @@ MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS = [ 'inst_cd', 'inst_name', 'ta_cd', + 'emp_chg_type_cd', 'emp_cd', 'emp_name_full', 'bu_cd', @@ -178,6 +179,7 @@ MENTE_CSV_DOWNLOAD_HEADER = [ '施設コード', '施設名', '領域コード', + '担当者種別コード', 'MUID', '担当者名', 'ビジネスユニットコード', diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 93ecf332..b0b50fe8 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -81,6 +81,17 @@ + + + 担当者種別コード: + + + + + 適用期間内: @@ -117,7 +128,7 @@ > - + 対象テーブル: @@ -160,7 +171,7 @@ > - + From 8c8be962a19c5d442f910798875325fed9ad577f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 16 Apr 2024 11:25:12 +0900 Subject: [PATCH 19/34] =?UTF-8?q?fix:=20jst=E5=8C=96=E3=81=AE=E4=B8=8D?= =?UTF-8?q?=E5=82=99=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/create_dcf_inst_merge.py | 2 +- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py index 294fe004..1fae0013 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py @@ -20,8 +20,8 @@ def exec(): db = Database.get_instance() try: db.connect() - db.to_jst() db.begin() + db.to_jst() logger.debug('DCF施設統合マスタ作成処理開始') # COM施設からDCF施設統合マスタに登録 (is_add_dcf_inst_merge, duplication_inst_records) = _insert_dcf_inst_merge_from_com_inst(db) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 3a1401da..9c5dbc9c 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -15,8 +15,8 @@ def exec(): db = Database.get_instance() try: db.connect() - db.to_jst() db.begin() + db.to_jst() logger.debug('DCF施設統合マスタ日次更新処理開始') # DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』) enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db) From 1a95ca1c845753760d59c30e7dca027747729342 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 16 Apr 2024 16:41:47 +0900 Subject: [PATCH 20/34] =?UTF-8?q?fix:=20CSV=E3=83=80=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E5=AE=9F=E8=A1=8C=E5=BE=8C=E3=81=AE?= =?UTF-8?q?=E5=88=9D=E6=9C=9F=E8=A1=A8=E7=A4=BA=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 1 + .../src/model/view/inst_emp_csv_download_view_model.py | 1 + 2 files changed, 2 insertions(+) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 4d130864..87b16978 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -270,6 +270,7 @@ def inst_emp_csv_download( ta_cd=csv_download_form.ta_cd, inst_cd=csv_download_form.inst_cd, emp_cd=csv_download_form.emp_cd, + emp_chg_type_cd=csv_download_form.emp_chg_type_cd, apply_date_from=csv_download_form.apply_date_from, start_date_from=csv_download_form.start_date_from, start_date_to=csv_download_form.start_date_to, diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py index aa04068d..e7ac331a 100644 --- a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -9,6 +9,7 @@ class InstEmpCsvDownloadViewModel(BaseModel): ta_cd: str = '' inst_cd: str = '' emp_cd: str = '' + emp_chg_type_cd: str = '' apply_date_from: str = '' start_date_from: str = '' start_date_to: str = '' From f9557f86f5ab2973bd3f3a9f91028c1687f21a76 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 16 Apr 2024 16:44:03 +0900 Subject: [PATCH 21/34] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py index adcb7b68..0ec43a10 100644 --- a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -9,7 +9,7 @@ from src.util.string_util import is_not_empty @sanitize class MasterMainteCsvDlModel(RequestBaseModel): - # adaptは検索に使用するようの値 + # adaptは検索に使用する値 ta_cd: Optional[str] adapt_ta_cd: Optional[str] inst_cd: Optional[str] From 9576dc054a085c4c072ad2b58dd1023c8717641f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 16 Apr 2024 16:57:35 +0900 Subject: [PATCH 22/34] =?UTF-8?q?=E4=B8=AD=E9=80=94=E3=83=97=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/generic_kbn_mst.py | 19 +++++++++ .../src/model/internal/master_mainte_csv.py | 42 +++++++++++++++---- .../generic_kbn_mst_repository.py | 29 +++++++++++++ .../src/services/master_mainte_service.py | 7 +++- 4 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/generic_kbn_mst.py create mode 100644 ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py diff --git a/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py b/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py new file mode 100644 index 00000000..ee189cd6 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py @@ -0,0 +1,19 @@ +from datetime import datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class GenericKbnMstModel(BaseDBModel): + generic_kbn_cd: Optional[str] + kbn_cd: Optional[str] + kbn_fulll_name_jp: Optional[str] + kbn_full_name_en: Optional[str] + kbn_name: Optional[str] + start_date: Optional[datetime] + end_date: Optional[datetime] + creator: Optional[str] + create_date: Optional[datetime] + updater: Optional[str] + update_date: Optional[datetime] + 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 619e736e..9910aa3b 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -10,6 +10,7 @@ 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.repositories.generic_kbn_mst_repository import GenericKbnMstRepository from src.logging.get_logger import get_logger logger = get_logger('マスターメンテ') @@ -24,6 +25,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): emp_master_repository: EmpMasterRepository bu_master_repository: BuMasterRepository emp_chginst_repository: EmpChgInstRepository + generic_kbn_mst_repository: GenericKbnMstRepository def __init__( self, @@ -33,7 +35,8 @@ class MasterMainteCSVItem(metaclass=ABCMeta): mst_inst_repository: MstInstRepository, emp_master_repository: EmpMasterRepository, bu_master_repository: BuMasterRepository, - emp_chginst_repository: EmpChgInstRepository + emp_chginst_repository: EmpChgInstRepository, + generic_kbn_mst_repository: GenericKbnMstRepository ): self.csv_row = csv_row self.table_name = table_name @@ -42,6 +45,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): self.emp_master_repository = emp_master_repository self.bu_master_repository = bu_master_repository self.emp_chginst_repository = emp_chginst_repository + self.generic_kbn_mst_repository = generic_kbn_mst_repository def validate(self) -> list[str]: """ @@ -213,7 +217,8 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): mst_inst_repository: MstInstRepository, emp_master_repository: EmpMasterRepository, bu_master_repository: BuMasterRepository, - emp_chginst_repository: EmpChgInstRepository + emp_chginst_repository: EmpChgInstRepository, + generic_kbn_mst_repository: GenericKbnMstRepository ): super().__init__( csv_row, @@ -222,7 +227,8 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): mst_inst_repository, emp_master_repository, bu_master_repository, - emp_chginst_repository + emp_chginst_repository, + generic_kbn_mst_repository ) 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) @@ -282,6 +288,14 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): 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 + + def check_emp_chg_type_cd_exists(self) -> list[str]: + error_list = [] + # TODO + # if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: + # error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ + # は担当者種別マスタに存在しないコードです。') + return error_list def check_bu_cd_exists(self) -> list[str]: error_list = [] @@ -446,6 +460,12 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list + + def check_emp_chg_type_cd_exists(self) -> list[str]: + error_list = [] + + # TODO if super().is + return error_list def check_bu_cd_exists(self) -> list[str]: error_list = [] @@ -537,7 +557,8 @@ class MasterMainteCSVItems: mst_inst_repository: MstInstRepository, emp_master_repository: EmpMasterRepository, bu_master_repository: BuMasterRepository, - emp_chginst_repository: EmpChgInstRepository + emp_chginst_repository: EmpChgInstRepository, + generic_kbn_mst_repository: GenericKbnMstRepository ) -> None: reader = csv.reader(file) csv_rows = [] @@ -552,7 +573,9 @@ class MasterMainteCSVItems: mst_inst_repository, emp_master_repository, bu_master_repository, - emp_chginst_repository)) + emp_chginst_repository, + generic_kbn_mst_repository + )) self.lines = csv_rows def __select_function(self, @@ -563,7 +586,8 @@ class MasterMainteCSVItems: mst_inst_repository: MstInstRepository, emp_master_repository: EmpMasterRepository, bu_master_repository: BuMasterRepository, - emp_chginst_repository: EmpChgInstRepository) -> MasterMainteCSVItem: + emp_chginst_repository: EmpChgInstRepository, + generic_kbn_mst_repository: GenericKbnMstRepository) -> MasterMainteCSVItem: if function_type == 'new': return MasterMainteNewInstEmpCSVItem( row, @@ -572,7 +596,8 @@ class MasterMainteCSVItems: mst_inst_repository, emp_master_repository, bu_master_repository, - emp_chginst_repository) + emp_chginst_repository, + generic_kbn_mst_repository) elif function_type == 'change': return MasterMainteChangeInstEmpCSVItem( row, @@ -581,4 +606,5 @@ class MasterMainteCSVItems: mst_inst_repository, emp_master_repository, bu_master_repository, - emp_chginst_repository) + emp_chginst_repository, + generic_kbn_mst_repository) diff --git a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py new file mode 100644 index 00000000..278d864a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py @@ -0,0 +1,29 @@ +from src.model.db.base_db_model import BaseDBModel +from src.repositories.base_repository import BaseRepository +from src.model.db.generic_kbn_mst import GenericKbnMstModel +from src.logging.get_logger import get_logger + +logger = get_logger('汎用区分マスタ') + +class GenericKbnMstRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + * + FROM + src05.generic_kbn_mst + WHERE + generic_kbn_mst.kbn_cd = :kbn_cd\ + """ + + def fetch_all(self, parameter) -> list[BaseDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, parameter) + models = [GenericKbnMstModel(**r) for r in result] + if len(models) == 0: + return None + return models[0] + except Exception as e: + logger.error(f"DB Error : Exception={e}") + raise e \ No newline at end of file diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index f3bbdb1a..d7e85638 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -19,6 +19,7 @@ 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.repositories.generic_kbn_mst_repository import GenericKbnMstRepository from src.model.internal.master_mainte_csv import MasterMainteCSVItems from src.model.internal.master_mainte_emp_chg_inst_function import NewEmpChgInstFunction from src.model.internal.master_mainte_emp_chg_inst_function import ChangeEmpChgInstFunction @@ -38,6 +39,7 @@ class MasterMainteService(BaseService): 'emp_master_repository': EmpMasterRepository, 'bu_master_repository': BuMasterRepository, 'emp_chginst_repository': EmpChgInstRepository, + 'generic_kbn_mst_repository': GenericKbnMstRepository, } CLIENTS = { @@ -48,6 +50,7 @@ class MasterMainteService(BaseService): emp_master_repository: EmpMasterRepository bu_master_repository: BuMasterRepository emp_chginst_repository: EmpChgInstRepository + generic_kbn_mst_repository: GenericKbnMstRepository s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: @@ -56,6 +59,7 @@ class MasterMainteService(BaseService): self.emp_master_repository = repositories['emp_master_repository'] self.bu_master_repository = repositories['bu_master_repository'] self.emp_chginst_repository = repositories['emp_chginst_repository'] + self.generic_kbn_mst_repository = repositories['generic_kbn_mst_repository'] self.s3_client = clients['s3_client'] def prepare_mainte_csv_up_view(self, @@ -77,7 +81,8 @@ class MasterMainteService(BaseService): self.mst_inst_repository, self.emp_master_repository, self.bu_master_repository, - self.emp_chginst_repository + self.emp_chginst_repository, + self.generic_kbn_mst_repository ) error_message_list = [] From df0f2d129f6f893894c96919d3bf064a7330e37b Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 17 Apr 2024 10:23:33 +0900 Subject: [PATCH 23/34] =?UTF-8?q?=E6=8B=85=E5=BD=93=E8=80=85=E7=A8=AE?= =?UTF-8?q?=E5=88=A5=E3=82=B3=E3=83=BC=E3=83=89CSV=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 14 +++++++++----- .../master_mainte_emp_chg_inst_function.py | 1 + .../src/repositories/emp_chg_inst_repository.py | 3 ++- .../repositories/generic_kbn_mst_repository.py | 15 ++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) 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 9910aa3b..3f1d5c42 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -96,6 +96,9 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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_emp_chg_type_cd(self) -> bool: + return True if self.generic_kbn_mst_repository.fetch_count(self.emp_chg_type_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 @@ -291,10 +294,9 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] - # TODO - # if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: - # error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ - # は担当者種別マスタに存在しないコードです。') + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ +は汎用区分マスタに存在しないコードです。') return error_list def check_bu_cd_exists(self) -> list[str]: @@ -464,7 +466,9 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] - # TODO if super().is + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ +は汎用区分マスタに存在しないコードです。') return error_list def check_bu_cd_exists(self) -> list[str]: diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py index 18a5cb0c..0ce3d2c8 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py @@ -46,6 +46,7 @@ class MasterMainteEmpChgInstFunction(metaclass=ABCMeta): self.emp_chginst_repository.insert_emp_chg_inst( data['施設コード'], data['領域コード'], + data['担当者種別コード'], data['MUID'], data['ビジネスユニットコード'], start_date, 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 07dcf34c..7df22275 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -57,13 +57,14 @@ class EmpChgInstRepository(BaseRepository): ) """ - def insert_emp_chg_inst(self, inst_cd, ta_cd, emp_cd, bu_cd, start_date, + def insert_emp_chg_inst(self, inst_cd, ta_cd, emp_chg_type_cd, emp_cd, bu_cd, start_date, end_date, create_user_name, table_name): try: query = self.INSERT_SQL.format(table_name=table_name) self._database.execute(query, { 'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'emp_chg_type_cd': emp_chg_type_cd, 'emp_cd': emp_cd, 'bu_cd': bu_cd, 'start_date': start_date, diff --git a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py index 278d864a..36d59fbd 100644 --- a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py +++ b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py @@ -1,6 +1,7 @@ from src.model.db.base_db_model import BaseDBModel from src.repositories.base_repository import BaseRepository from src.model.db.generic_kbn_mst import GenericKbnMstModel +from src.model.db.master_mente_count import MasterMenteCountModel from src.logging.get_logger import get_logger logger = get_logger('汎用区分マスタ') @@ -9,21 +10,21 @@ class GenericKbnMstRepository(BaseRepository): FETCH_SQL = """\ SELECT - * + COUNT(*) AS count FROM src05.generic_kbn_mst WHERE generic_kbn_mst.kbn_cd = :kbn_cd\ """ - def fetch_all(self, parameter) -> list[BaseDBModel]: + def fetch_count(self, parameter) -> MasterMenteCountModel: try: query = self.FETCH_SQL - result = self._database.execute_select(query, parameter) - models = [GenericKbnMstModel(**r) for r in result] + result = self._database.execute_select(query, {'kbn_cd': parameter}) + models = [MasterMenteCountModel(**r) for r in result] if len(models) == 0: - return None - return models[0] + return 0 + return models[0].count except Exception as e: - logger.error(f"DB Error : Exception={e}") + logger.error(f"DB Error : Exception={e.args}") raise e \ No newline at end of file From e29bbe445506c90090c86bf7bd6b452299098791 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 17 Apr 2024 18:45:07 +0900 Subject: [PATCH 24/34] =?UTF-8?q?=E6=96=BD=E8=A8=AD=E6=8B=85=E5=BD=93?= =?UTF-8?q?=E8=80=85=E5=A4=89=E6=9B=B4=E5=AE=9F=E8=A3=85=E3=83=BB=E6=8C=87?= =?UTF-8?q?=E6=91=98=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/generic_kbn_mst.py | 19 ------- .../src/model/internal/master_mainte_csv.py | 57 ++++++++++++++----- .../generic_kbn_mst_repository.py | 13 +++-- .../src/services/master_mainte_service.py | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 15 +++-- 5 files changed, 62 insertions(+), 44 deletions(-) delete mode 100644 ecs/jskult-webapp/src/model/db/generic_kbn_mst.py diff --git a/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py b/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py deleted file mode 100644 index ee189cd6..00000000 --- a/ecs/jskult-webapp/src/model/db/generic_kbn_mst.py +++ /dev/null @@ -1,19 +0,0 @@ -from datetime import datetime -from typing import Optional - -from src.model.db.base_db_model import BaseDBModel - - -class GenericKbnMstModel(BaseDBModel): - generic_kbn_cd: Optional[str] - kbn_cd: Optional[str] - kbn_fulll_name_jp: Optional[str] - kbn_full_name_en: Optional[str] - kbn_name: Optional[str] - start_date: Optional[datetime] - end_date: Optional[datetime] - creator: Optional[str] - create_date: Optional[datetime] - updater: Optional[str] - update_date: Optional[datetime] - 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 3f1d5c42..be740eb7 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -63,6 +63,8 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list.extend(self.check_inst_cd_exists()) # 担当者種別コード存在チェック error_list.extend(self.check_emp_chg_type_cd_exists()) + # 領域コード存在チェック + error_list.extend(self.check_ta_cd_exists()) # MUID存在チェック error_list.extend(self.check_emp_cd_exists()) # BuCd存在チェック @@ -97,8 +99,11 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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_emp_chg_type_cd(self) -> bool: - return True if self.generic_kbn_mst_repository.fetch_count(self.emp_chg_type_cd) > 0 else False + def is_exist_emp_chg_type_cd(self, start_date) -> bool: + return True if self.generic_kbn_mst_repository.fetch_count('emp_chg_type_cd', self.emp_chg_type_cd, start_date) > 0 else False + + def is_exist_ta_cd(self, start_date: str) -> bool: + return True if self.generic_kbn_mst_repository.fetch_count('ta_cd', self.ta_cd, start_date) > 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 @@ -175,6 +180,12 @@ class MasterMainteCSVItem(metaclass=ABCMeta): pass ... + @abstractmethod + def check_ta_cd_exists(self) -> list[str]: + """領域コード存在チェック""" + pass + ... + @abstractmethod def check_emp_cd_exists(self) -> list[str]: """MUID存在チェック""" @@ -255,12 +266,12 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO])) - if len(self.emp_cd) == 0: - error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO])) if len(self.emp_chg_type_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO])) + if len(self.emp_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO])) if len(self.bu_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO])) @@ -291,12 +302,19 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): 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 - + def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] - if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd(self.start_date) is False: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ -は汎用区分マスタに存在しないコードです。') +は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') + return error_list + + def check_ta_cd_exists(self) -> list[str]: + error_list = [] + if is_not_empty(self.ta_cd) and super().is_exist_ta_cd(self.start_date) is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO]}\ +は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') return error_list def check_bu_cd_exists(self) -> list[str]: @@ -357,7 +375,8 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): mst_inst_repository: MstInstRepository, emp_master_repository: EmpMasterRepository, bu_master_repository: BuMasterRepository, - emp_chginst_repository: EmpChgInstRepository + emp_chginst_repository: EmpChgInstRepository, + generic_kbn_mst_repository: GenericKbnMstRepository ): super().__init__( csv_row, @@ -366,7 +385,8 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): mst_inst_repository, emp_master_repository, bu_master_repository, - emp_chginst_repository + emp_chginst_repository, + generic_kbn_mst_repository ) 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) @@ -376,6 +396,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): 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_chg_type_cd = super().get_csv_value(constants.CSV_CHANGE_EMP_CHG_TYPE_CD_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) @@ -398,6 +419,9 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) + if len(self.emp_chg_type_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO])) if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO])) @@ -466,9 +490,16 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] - if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd() is False: - error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ -は汎用区分マスタに存在しないコードです。') + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd(self.inst_emp_start_date) is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO]}\ +は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') + return error_list + + def check_ta_cd_exists(self) -> list[str]: + error_list = [] + if is_not_empty(self.ta_cd) and super().is_exist_ta_cd(self.inst_emp_start_date) is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO]}\ +は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') return error_list def check_bu_cd_exists(self) -> list[str]: diff --git a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py index 36d59fbd..18995972 100644 --- a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py +++ b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py @@ -1,6 +1,4 @@ -from src.model.db.base_db_model import BaseDBModel from src.repositories.base_repository import BaseRepository -from src.model.db.generic_kbn_mst import GenericKbnMstModel from src.model.db.master_mente_count import MasterMenteCountModel from src.logging.get_logger import get_logger @@ -14,13 +12,18 @@ class GenericKbnMstRepository(BaseRepository): FROM src05.generic_kbn_mst WHERE - generic_kbn_mst.kbn_cd = :kbn_cd\ + generic_kbn_mst.generic_kbn_cd = :generic_kbn_cd + AND + generic_kbn_mst.kbn_cd = :kbn_cd + AND + STR_TO_DATE( :start_date , '%Y%m%d') BETWEEN generic_kbn_mst.start_date AND generic_kbn_mst.end_date\ """ - def fetch_count(self, parameter) -> MasterMenteCountModel: + + def fetch_count(self, generic_kbn_cd, kbn_cd, start_date) -> MasterMenteCountModel: try: query = self.FETCH_SQL - result = self._database.execute_select(query, {'kbn_cd': parameter}) + result = self._database.execute_select(query, {'generic_kbn_cd': generic_kbn_cd, 'kbn_cd': kbn_cd, 'start_date' : start_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 d7e85638..168f1075 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -73,7 +73,7 @@ class MasterMainteService(BaseService): raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) - +# TODO csv_items = MasterMainteCSVItems( file, csv_upload_form.select_function, diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index f592f370..5bd8a878 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -119,6 +119,7 @@ CHANGE_INST_CSV_LOGICAL_NAMES = [ '施設名', '領域コード', '説明', + '担当者種別コード', 'MUID', '担当者名', '施設担当_開始日', @@ -142,18 +143,20 @@ CSV_CHANGE_INST_NAME_COL_NO = 5 CSV_CHANGE_TA_CD_COL_NO = 6 # 説明の列No CSV_CHANGE_EXPLAIN_COL_NO = 7 +# 担当者種別コード +CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO = 8 # MUIDの列No -CSV_CHANGE_EMP_CD_COL_NO = 8 +CSV_CHANGE_EMP_CD_COL_NO = 9 # 担当者名の列No -CSV_CHANGE_EMP_FULL_NAME_COL_NO = 9 +CSV_CHANGE_EMP_FULL_NAME_COL_NO = 10 # 施設担当_開始日の列No -CSV_CHANGE_INST_EMP_START_DATE_COL_NO = 10 +CSV_CHANGE_INST_EMP_START_DATE_COL_NO = 11 # 施設担当_終了日の列No -CSV_CHANGE_INST_EMP_END_DATE_COL_NO = 11 +CSV_CHANGE_INST_EMP_END_DATE_COL_NO = 12 # 終了日の変更の列No -CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 +CSV_CHANGE_CHANGE_END_DATE_COL_NO = 13 # コメントの列No -CSV_CHANGE_COMMENT = 13 +CSV_CHANGE_COMMENT = 14 # CSVアップロードテーブル名(マスターメンテ) CSV_REAL_TABLE_NAME = '本番テーブル' From b878ded447ee5492524e45f6e04b01f9f8efef02 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 18 Apr 2024 10:27:08 +0900 Subject: [PATCH 25/34] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 2 +- .../model/internal/master_mainte_emp_chg_inst_function.py | 4 +++- .../src/repositories/emp_chg_inst_repository.py | 6 ++++-- .../src/repositories/generic_kbn_mst_repository.py | 2 +- ecs/jskult-webapp/src/services/master_mainte_service.py | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) 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 be740eb7..fe4e328d 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -99,7 +99,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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_emp_chg_type_cd(self, start_date) -> bool: + def is_exist_emp_chg_type_cd(self, start_date: str) -> bool: return True if self.generic_kbn_mst_repository.fetch_count('emp_chg_type_cd', self.emp_chg_type_cd, start_date) > 0 else False def is_exist_ta_cd(self, start_date: str) -> bool: diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py index 0ce3d2c8..1c79b75e 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py @@ -29,8 +29,8 @@ class MasterMainteEmpChgInstFunction(metaclass=ABCMeta): def save(self): error_list = [] try: - self.emp_chginst_repository.to_jst() self.emp_chginst_repository.begin() + self.emp_chginst_repository.to_jst() (result_message, error_list) = self.write_emp_chg_inst_table() if len(error_list) > 0: self.emp_chginst_repository.rollback() @@ -149,6 +149,7 @@ class ChangeEmpChgInstFunction(MasterMainteEmpChgInstFunction): self.emp_chginst_repository.end_emp_chg_inst( data['施設コード'], data['領域コード'], + data['担当者種別コード'], data['施設担当_開始日'], data['終了日の変更'], self.user_name, @@ -159,6 +160,7 @@ class ChangeEmpChgInstFunction(MasterMainteEmpChgInstFunction): data['施設コード'], data['領域コード'], data['施設担当_開始日'], + data['担当者種別コード'], data['MUID'], self.user_name, self.table_name) 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 7df22275..6019b48c 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -89,13 +89,14 @@ class EmpChgInstRepository(BaseRepository): and start_date = :start_date """ - def end_emp_chg_inst(self, inst_cd, ta_cd, start_date, + def end_emp_chg_inst(self, inst_cd, ta_cd, emp_chg_type_cd, start_date, end_date, update_user_name, table_name): try: query = self.UPDATE_END_DATE_SQL.format(table_name=table_name) self._database.execute(query, { 'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'emp_chg_type_cd': emp_chg_type_cd, 'start_date': start_date, 'end_date': end_date, 'update_user_name': update_user_name @@ -117,12 +118,13 @@ class EmpChgInstRepository(BaseRepository): and start_date = :start_date """ - def modify_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_chg_type_cd, emp_cd, update_user_name, table_name): try: query = self.UPDATE_EMP_CD_SQL.format(table_name=table_name) self._database.execute(query, { 'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'emp_chg_type_cd': emp_chg_type_cd, 'start_date': start_date, 'emp_cd': emp_cd, 'update_user_name': update_user_name diff --git a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py index 18995972..e2d210c4 100644 --- a/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py +++ b/ecs/jskult-webapp/src/repositories/generic_kbn_mst_repository.py @@ -20,7 +20,7 @@ class GenericKbnMstRepository(BaseRepository): """ - def fetch_count(self, generic_kbn_cd, kbn_cd, start_date) -> MasterMenteCountModel: + def fetch_count(self, generic_kbn_cd: str, kbn_cd: str, start_date: str) -> MasterMenteCountModel: try: query = self.FETCH_SQL result = self._database.execute_select(query, {'generic_kbn_cd': generic_kbn_cd, 'kbn_cd': kbn_cd, 'start_date' : start_date}) diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 168f1075..6f612a87 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -73,7 +73,7 @@ class MasterMainteService(BaseService): raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) -# TODO + csv_items = MasterMainteCSVItems( file, csv_upload_form.select_function, @@ -153,8 +153,8 @@ class MasterMainteService(BaseService): def copy_data_real_to_dummy(self) -> TableOverrideViewModel: try: - self.emp_chginst_repository.to_jst() self.emp_chginst_repository.begin() + self.emp_chginst_repository.to_jst() self.emp_chginst_repository.delete_dummy_table() self.emp_chginst_repository.copy_real_to_dummy() self.emp_chginst_repository.commit() From ac2c2f0f16b2b3c65bd3a05b61a9f6a69488d772 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 18 Apr 2024 17:36:53 +0900 Subject: [PATCH 26/34] =?UTF-8?q?start=5Fdate=E3=81=8C=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=81=A8=E3=81=8D=E7=A8=AE=E5=88=A5?= =?UTF-8?q?=E6=8B=85=E5=BD=93=E8=80=85=E5=88=A4=E5=AE=9A=E3=82=92=E9=99=A4?= =?UTF-8?q?=E5=A4=96=E3=81=99=E3=82=8B=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 4 ++++ 1 file changed, 4 insertions(+) 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 fe4e328d..a547ee18 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -100,9 +100,13 @@ class MasterMainteCSVItem(metaclass=ABCMeta): return True if self.mst_inst_repository.fetch_count(self.inst_cd) > 0 else False def is_exist_emp_chg_type_cd(self, start_date: str) -> bool: + if start_date is None or len(start_date) == 0: + return False return True if self.generic_kbn_mst_repository.fetch_count('emp_chg_type_cd', self.emp_chg_type_cd, start_date) > 0 else False def is_exist_ta_cd(self, start_date: str) -> bool: + if start_date is None or len(start_date) == 0: + return False return True if self.generic_kbn_mst_repository.fetch_count('ta_cd', self.ta_cd, start_date) > 0 else False def is_exist_bu_cd(self) -> bool: From 35993730d6c93fb68f7f297aec828581a50eb7eb Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 22 Apr 2024 10:32:55 +0900 Subject: [PATCH 27/34] =?UTF-8?q?=E9=96=8B=E5=A7=8B=E6=97=A5=E6=9C=AA?= =?UTF-8?q?=E5=85=A5=E5=8A=9B=E3=81=AB=E5=AF=BE=E3=81=97=E3=81=A6=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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 a547ee18..57b5c7c7 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -102,12 +102,16 @@ class MasterMainteCSVItem(metaclass=ABCMeta): def is_exist_emp_chg_type_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False - return True if self.generic_kbn_mst_repository.fetch_count('emp_chg_type_cd', self.emp_chg_type_cd, start_date) > 0 else False + if self.generic_kbn_mst_repository.fetch_count('emp_chg_type_cd', self.emp_chg_type_cd, start_date) > 0: + return True + return False def is_exist_ta_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False - return True if self.generic_kbn_mst_repository.fetch_count('ta_cd', self.ta_cd, start_date) > 0 else False + if self.generic_kbn_mst_repository.fetch_count('ta_cd', self.ta_cd, start_date) > 0: + return True + return False def is_exist_bu_cd(self) -> bool: return True if self.bu_master_repository.fetch_count(self.bu_cd) > 0 else False @@ -309,6 +313,9 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] + if not self.start_date or not self.emp_chg_type_cd: + return error_list + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd(self.start_date) is False: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') @@ -316,6 +323,9 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_ta_cd_exists(self) -> list[str]: error_list = [] + if not self.start_date or not self.ta_cd: + return error_list + if is_not_empty(self.ta_cd) and super().is_exist_ta_cd(self.start_date) is False: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') @@ -494,6 +504,9 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] + if not self.inst_emp_start_date or not self.emp_chg_type_cd: + return error_list + if is_not_empty(self.emp_chg_type_cd) and super().is_exist_emp_chg_type_cd(self.inst_emp_start_date) is False: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') @@ -501,6 +514,10 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_ta_cd_exists(self) -> list[str]: error_list = [] + + if not self.inst_emp_start_date or not self.ta_cd: + return error_list + if is_not_empty(self.ta_cd) and super().is_exist_ta_cd(self.inst_emp_start_date) is False: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') From 18f215f4f6ccd9ff022cc38702b77880ce01b559 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 22 Apr 2024 15:07:07 +0900 Subject: [PATCH 28/34] =?UTF-8?q?SQL=E6=A4=9C=E7=B4=A2=E3=81=AB=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E7=A8=AE=E5=88=A5=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 13 ++++++++++--- .../src/repositories/emp_chg_inst_repository.py | 7 ++++--- 2 files changed, 14 insertions(+), 6 deletions(-) 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 57b5c7c7..1ccd862b 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -87,7 +87,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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) + return self.emp_chginst_repository.fetch_count(self.inst_cd, self.ta_cd, self.emp_chg_type_cd, start_date, self.table_name) def is_exist_emp_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: @@ -454,6 +454,9 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) + if len(self.emp_chg_type_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: error_list.append(self.make_require_error_message( self.line_num, @@ -469,6 +472,10 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) + if len(self.emp_chg_type_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO])) + if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO])) @@ -572,10 +579,10 @@ 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(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが既に登録されています。') + error_list.append(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、施設担当_開始日がすべて同一のデータが既に登録されています。') elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: - error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') + error_list.append(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') return error_list 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 6019b48c..e7359626 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -132,7 +132,7 @@ class EmpChgInstRepository(BaseRepository): except Exception as e: logger.exception(f'DB Error : Exception={e.args}') raise e - +# TODO FETCH_COUNT_SQL = """\ SELECT COUNT(*) AS count @@ -142,13 +142,14 @@ class EmpChgInstRepository(BaseRepository): inst_cd = :inst_cd AND ta_cd = :ta_cd AND start_date = :start_date + AND emp_chg_type_cd = :emp_chg_type_cd """ - def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: + def fetch_count(self, inst_cd, ta_cd, emp_chg_type_cd, start_date, table_name) -> MasterMenteCountModel: try: 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}) + 'emp_chg_type_cd': emp_chg_type_cd,'start_date': start_date}) models = [MasterMenteCountModel(**r) for r in result] if len(models) == 0: return 0 From cc0e1cb5763ee41558ee293e42f5f2ad67b6d692 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 23 Apr 2024 11:27:15 +0900 Subject: [PATCH 29/34] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E9=A0=86=E7=95=AA=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1ccd862b..70ad315a 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -61,10 +61,10 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list.extend(self.check_require()) # 施設コード存在チェック error_list.extend(self.check_inst_cd_exists()) - # 担当者種別コード存在チェック - error_list.extend(self.check_emp_chg_type_cd_exists()) # 領域コード存在チェック error_list.extend(self.check_ta_cd_exists()) + # 担当者種別コード存在チェック + error_list.extend(self.check_emp_chg_type_cd_exists()) # MUID存在チェック error_list.extend(self.check_emp_cd_exists()) # BuCd存在チェック From a726bb90fe175f78165f9a7c4c6cdd6bb7a21aa2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Apr 2024 13:01:47 +0900 Subject: [PATCH 30/34] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E5=89=8A=E9=99=A4=E3=80=81=E6=9D=A1=E4=BB=B6=E3=81=AE?= =?UTF-8?q?=E9=A0=86=E7=95=AA=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e7359626..6b585080 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -132,7 +132,7 @@ class EmpChgInstRepository(BaseRepository): except Exception as e: logger.exception(f'DB Error : Exception={e.args}') raise e -# TODO + FETCH_COUNT_SQL = """\ SELECT COUNT(*) AS count @@ -141,8 +141,8 @@ class EmpChgInstRepository(BaseRepository): WHERE inst_cd = :inst_cd AND ta_cd = :ta_cd - AND start_date = :start_date AND emp_chg_type_cd = :emp_chg_type_cd + AND start_date = :start_date """ def fetch_count(self, inst_cd, ta_cd, emp_chg_type_cd, start_date, table_name) -> MasterMenteCountModel: From f830c55160796d83b151bfa2d24507c5c629099f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Apr 2024 17:17:47 +0900 Subject: [PATCH 31/34] =?UTF-8?q?fix:=20=E6=96=B0=E8=A6=8F=E6=96=BD?= =?UTF-8?q?=E8=A8=AD=E7=99=BB=E9=8C=B2=E3=81=AE=E9=87=8D=E8=A4=87=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E7=99=BA=E7=94=9F=E6=99=82=E3=81=AB=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=95=E3=82=8C=E3=82=8B=E3=83=A1=E3=83=83=E3=82=BB?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=81=AB=E6=8B=85=E5=BD=93=E8=80=85=E7=A8=AE?= =?UTF-8?q?=E5=88=A5=E3=82=B3=E3=83=BC=E3=83=89=E3=81=8C=E5=90=AB=E3=81=BE?= =?UTF-8?q?=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 70ad315a..6b5b7754 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -98,7 +98,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): 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_emp_chg_type_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False @@ -325,7 +325,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): error_list = [] if not self.start_date or not self.ta_cd: return error_list - + if is_not_empty(self.ta_cd) and super().is_exist_ta_cd(self.start_date) is False: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') @@ -363,7 +363,7 @@ 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(f'{self.line_num}行目の施設コード、領域コード、適用開始日がすべて同一のデータが既に登録されています。') + error_list.append(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、適用開始日がすべて同一のデータが既に登録されています。') return error_list @@ -507,7 +507,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list - + def check_emp_chg_type_cd_exists(self) -> list[str]: error_list = [] @@ -518,7 +518,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO]}\ は汎用区分マスタに存在しない もしくは 適用期間外のコードです。') return error_list - + def check_ta_cd_exists(self) -> list[str]: error_list = [] From 6208fb1ac317511611c7433e7cb4fc953fd2be5f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Apr 2024 18:24:24 +0900 Subject: [PATCH 32/34] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3=E3=80=82=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E5=AD=98=E5=9C=A8=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=AE=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=81=AB=E3=80=81=E9=A0=85=E7=9B=AE=E8=AB=96?= =?UTF-8?q?=E7=90=86=E5=90=8D=E3=81=AE=E5=AE=9A=E6=95=B0=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) 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 6b5b7754..a6146731 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -1,17 +1,17 @@ import csv import json - -from io import TextIOWrapper -from datetime import datetime from abc import ABCMeta, abstractmethod +from datetime import datetime +from io import TextIOWrapper + +from src.logging.get_logger import get_logger +from src.repositories.bu_master_cd_repository import BuMasterRepository +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.repositories.emp_master_repository import EmpMasterRepository +from src.repositories.generic_kbn_mst_repository import GenericKbnMstRepository +from src.repositories.mst_inst_repository import MstInstRepository from src.system_var import constants from src.util.string_util import is_not_empty -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.repositories.generic_kbn_mst_repository import GenericKbnMstRepository -from src.logging.get_logger import get_logger logger = get_logger('マスターメンテ') @@ -119,6 +119,16 @@ class MasterMainteCSVItem(metaclass=ABCMeta): def make_require_error_message(self, line_num: str, col_name: str) -> str: return f'{line_num}行目の{col_name}が入力されておりません。' + def make_data_exist_error_message(self, line_num: str, primary_key_col_names: list[str]) -> str: + return self.__make_check_data_exists_error_message(line_num, primary_key_col_names, 'がすべて同一のデータが既に登録されています。') + + def make_data_not_exist_error_message(self, line_num: str, primary_key_col_names: list[str]) -> str: + return self.__make_check_data_exists_error_message(line_num, primary_key_col_names, 'がすべて同一のデータが存在しないため更新できません。') + + def __make_check_data_exists_error_message(self, line_num: str, primary_key_col_names: list[str], suffix_message: str) -> str: + primary_key_logical_names = '、'.join(primary_key_col_names) + return f'{line_num}行目の{primary_key_logical_names}{suffix_message}' + def __parse_str_to_date(self, check_date: str) -> tuple[bool, datetime]: try: check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') @@ -363,7 +373,15 @@ 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(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、適用開始日がすべて同一のデータが既に登録されています。') + error_list.append(super().make_data_exist_error_message( + self.line_num, + primary_key_col_names=[ + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO], + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO], + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CHG_TYPE_CD_COL_NO], + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE] + ] + )) return error_list @@ -579,10 +597,26 @@ 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(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、施設担当_開始日がすべて同一のデータが既に登録されています。') + error_list.append(super().make_data_exist_error_message( + self.line_num, + primary_key_col_names=[ + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO] + ] + )) elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: - error_list.append(f'{self.line_num}行目の施設コード、領域コード、担当者種別コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') + error_list.append(super().make_data_not_exist_error_message( + self.line_num, + primary_key_col_names=[ + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CHG_TYPE_CD_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO] + ] + )) return error_list From 469d2f46bcb74bacf6151d34f06d03292b1ab701 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 25 Apr 2024 10:35:59 +0900 Subject: [PATCH 33/34] =?UTF-8?q?fix:=20=E7=B5=90=E5=90=88=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82=20=E6=8B=85=E5=BD=93=E8=BB=8A=E7=A8=AE=E5=88=A5?= =?UTF-8?q?=E3=81=AE=E7=95=B0=E3=81=AA=E3=82=8B=E6=96=BD=E8=A8=AD=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E3=81=AE=E3=83=AC=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=8C=E7=84=A1=E5=8A=B9=E5=8C=96=E3=81=95=E3=82=8C=E3=80=81?= =?UTF-8?q?=E9=87=8D=E8=A4=87=E7=9B=B8=E6=89=8B=E5=85=88=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=AE=E3=83=AC=E3=82=B3=E3=83=BC=E3=83=89=E3=81=8C?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=80=82?= =?UTF-8?q?=20=E9=87=8D=E8=A4=87=E7=9B=B8=E6=89=8B=E5=85=88=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E6=96=BD=E8=A8=AD=E6=8B=85=E5=BD=93?= =?UTF-8?q?=E8=80=85=E3=83=AC=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E6=9D=A1=E4=BB=B6=E3=81=AB=E6=8B=85=E5=BD=93=E8=80=85?= =?UTF-8?q?=E7=A8=AE=E5=88=A5=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E6=BC=8F=E3=82=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 9c5dbc9c..eeb2ebd2 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -548,6 +548,7 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: WHERE eciopp.inst_cd = :dup_opp_cd AND eciopp.ta_cd = :ta_cd + AND eciopp.emp_chg_type_cd = :emp_chg_type_cd ) AS opp_count FROM src05.emp_chg_inst AS eci From 93c4613456637afb43942c908f9e6a634c5369e2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 25 Apr 2024 16:40:23 +0900 Subject: [PATCH 34/34] =?UTF-8?q?fix:=20=E7=B5=90=E5=90=88=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88M-1-2=E3=82=B1=E3=83=BC=E3=82=B9=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E3=80=82=E7=B5=82=E4=BA=86=E3=83=BB=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E5=A4=89=E6=9B=B4=E3=81=AESQL=E3=81=AE?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=8C=87=E5=AE=9A=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/repositories/emp_chg_inst_repository.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 d8606bda..fe5329f2 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -85,8 +85,9 @@ class EmpChgInstRepository(BaseRepository): update_date = NOW() WHERE inst_cd = :inst_cd - and ta_cd = :ta_cd - and start_date = :start_date + AND ta_cd = :ta_cd + AND emp_chg_type_cd = :emp_chg_type_cd + AND start_date = :start_date """ def end_emp_chg_inst(self, inst_cd, ta_cd, emp_chg_type_cd, start_date, @@ -114,8 +115,9 @@ class EmpChgInstRepository(BaseRepository): update_date = NOW() where inst_cd = :inst_cd - and ta_cd = :ta_cd - and start_date = :start_date + AND ta_cd = :ta_cd + AND emp_chg_type_cd = :emp_chg_type_cd + AND start_date = :start_date """ def modify_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_chg_type_cd, emp_cd, update_user_name, table_name): @@ -149,7 +151,7 @@ class EmpChgInstRepository(BaseRepository): try: query = self.FETCH_COUNT_SQL.format(table_name=table_name) result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, - 'emp_chg_type_cd': emp_chg_type_cd,'start_date': start_date}) + 'emp_chg_type_cd': emp_chg_type_cd, 'start_date': start_date}) models = [MasterMenteCountModel(**r) for r in result] if len(models) == 0: return 0