Merge branch 'develop' into feature-NEWDWH2021-1011
This commit is contained in:
commit
f420bf341e
@ -3,4 +3,8 @@ DB_PORT=************
|
||||
DB_USERNAME=************
|
||||
DB_PASSWORD=************
|
||||
DB_SCHEMA=src05
|
||||
LOG_LEVEL=INFO
|
||||
LOG_LEVEL=INFO
|
||||
ULTMARC_DATA_BUCKET=****************
|
||||
ULTMARC_DATA_FOLDER=recv
|
||||
ULTMARC_BACKUP_BUCKET=****************
|
||||
ULTMARC_BACKUP_FOLDER=ultmarc
|
||||
|
||||
2
ecs/jskult-batch-daily/.vscode/launch.json
vendored
2
ecs/jskult-batch-daily/.vscode/launch.json
vendored
@ -5,7 +5,7 @@
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Batch Sample",
|
||||
"name": "(DEBUG)jskult batch daily",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "entrypoint.py",
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
"--ignore=F541"
|
||||
],
|
||||
"python.testing.pytestArgs": [
|
||||
"tests"
|
||||
"tests/batch/ultmarc"
|
||||
],
|
||||
|
||||
"python.testing.unittestEnabled": false,
|
||||
|
||||
@ -12,79 +12,207 @@
|
||||
|
||||
## 環境構築
|
||||
|
||||
- Pythonの構築
|
||||
- Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照
|
||||
- 「Pipenvの導入」までを行っておくこと
|
||||
- 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する
|
||||
- `pipenv install --dev --python <pyenvでインストールしたpythonバージョン>`
|
||||
- この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく
|
||||
- Python の構築
|
||||
|
||||
- MySQLの環境構築
|
||||
- Windowsの場合、以下のリンクからダウンロードする
|
||||
- Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照
|
||||
- 「Pipenv の導入」までを行っておくこと
|
||||
- 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する
|
||||
- `pipenv install --dev --python <pyenvでインストールしたpythonバージョン>`
|
||||
- この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく
|
||||
|
||||
- MySQL の環境構築
|
||||
- Windows の場合、以下のリンクからダウンロードする
|
||||
- <https://dev.mysql.com/downloads/installer/>
|
||||
- Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利
|
||||
- Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利
|
||||
- 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると
|
||||
- `docker-compose up -d`
|
||||
- Dockerの構築手順は、[Dockerのセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと
|
||||
- Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと
|
||||
- データを投入する
|
||||
- 立ち上げたデータベースに「src05」スキーマを作成する
|
||||
- [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysqlコマンドを使用して復元する
|
||||
- [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する
|
||||
- `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql`
|
||||
- 環境変数の設定
|
||||
- 「.env.example」ファイルをコピーし、「.env」ファイルを作成する
|
||||
- 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください
|
||||
- VSCodeの設定
|
||||
- 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください
|
||||
- VSCode の設定
|
||||
- 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する
|
||||
- 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する
|
||||
- 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する
|
||||
|
||||
## 実行
|
||||
|
||||
- VSCode上で「F5」キーを押下すると、バッチ処理が起動する。
|
||||
- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。
|
||||
- 「entrypoint.py」が、バッチ処理のエントリーポイント。
|
||||
- 実際の処理は、「src/jobctrl_daily.py」で行っている。
|
||||
|
||||
## 単体テスト
|
||||
|
||||
アルトマーク取込処理は、単体テストコードを使用してテスト自動化を行う
|
||||
|
||||
### テスト準備
|
||||
|
||||
- VSCodeで以下の拡張機能をインストールする
|
||||
- Python
|
||||
- Python Test Explorer for Visual Studio Code
|
||||
- Test Explorer UI
|
||||
- VSCode 上でショートカット「ctrl」+「shift」+「P」でコマンドパレットを開く
|
||||
- コマンドパレットの検索窓に「Python」と入力し、「Python: テストを構成する」を押下する
|
||||
- 現在のワークスペースを選び、「pytest」を選択する
|
||||
- 「tests」フォルダを選択する
|
||||
- バックグランドで、pytest モジュールのインストールが始まれば成功
|
||||
|
||||
### テスト用のサブコマンド一覧
|
||||
|
||||
- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる
|
||||
- `Pipfile`内の「scripts」セクションに宣言されている
|
||||
|
||||
| コマンド | 概要 |
|
||||
| ---------------- | -------------------------------------------------------------------------------------------- |
|
||||
| test:ultmarc | tests/batch/ultmarc フォルダ配下のユニットテストを実行する |
|
||||
| test:ultmarc:cov | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) |
|
||||
|
||||
### テスト共通関数の仕様
|
||||
|
||||
- tests/testing_utility.py内の共通関数の仕様について記載する
|
||||
|
||||
#### create_ultmarc_test_data_from_csv
|
||||
|
||||
- 引数
|
||||
- file_path: str
|
||||
- 戻り値
|
||||
- src.batch.ultmarc.datfile.DatFileのインスタンス
|
||||
- 処理概要
|
||||
- CSVファイルから、アルトマークのインプットデータを作成する
|
||||
- データフォーマットは以下
|
||||
- 文字コード: UTF-8
|
||||
- 改行コード:LF
|
||||
- ヘッダ: なし
|
||||
- 値囲い: ダブルクォート
|
||||
- アルトマークデータと文字コードを合わせるため、指定されたファイルを一時ディレクトリに、文字コード「cp932」で書き出してからテストデータとして読み込む
|
||||
- テストデータそのものはUTF-8の文字コードで作成すること
|
||||
|
||||
### create_db_data_from_csv
|
||||
|
||||
- 引数
|
||||
- file_path: str
|
||||
- 戻り値
|
||||
- テーブルのレコードに相当する辞書のリスト
|
||||
- 処理概要
|
||||
- CSVファイルから、アルトマークテーブルに相当するテストデータを作成する
|
||||
- テストの初期データ、期待値データを作成するのに利用する
|
||||
- データフォーマットは以下
|
||||
- 文字コード: UTF-8
|
||||
- 改行コード:LF
|
||||
- ヘッダ: なし
|
||||
- 値囲い: ダブルクォート
|
||||
- ファイル内の、以下の形式のデータを自動的に変換する
|
||||
- `NULL`
|
||||
- `None`に変換される
|
||||
- `yyyy-mm-dd`もしくは、`yyyy/mm/dd`の文字
|
||||
- Date型に変換される
|
||||
- `yyyy-mm-dd hh:mm:ss`もしくは、`yyyy/mm/dd hh:mm:ss`の文字
|
||||
- DateTime型に変換される
|
||||
|
||||
### create_insert_sql_with_parameter
|
||||
|
||||
- 引数
|
||||
- table_name: str テーブル名
|
||||
- column_names: list[str] カラム名のリスト
|
||||
- test_data: list[str]: 値のリスト
|
||||
- 戻り値
|
||||
- INSERT文とバインドパラメータ辞書
|
||||
- 処理概要
|
||||
- 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でINSERT文、バインドパラメータを作成する
|
||||
|
||||
### create_delete_sql_with_parameter
|
||||
|
||||
- 引数
|
||||
- table_name: str テーブル名
|
||||
- column_names: list[str] カラム名のリスト
|
||||
- test_data: list[str]: 値のリスト
|
||||
- 戻り値
|
||||
- DELETE文とバインドパラメータ辞書
|
||||
- 処理概要
|
||||
- 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でDELETE文、バインドパラメータを作成する
|
||||
|
||||
### create_ultmarc_table_mapper_sut
|
||||
|
||||
- 引数
|
||||
- line: src.batch.ultmarc.datfile.DatFileLine アルトマークデータファイルの1行
|
||||
- db: src.db.Database データベース操作クラス
|
||||
- 戻り値
|
||||
- マッパークラス
|
||||
- 処理概要
|
||||
- src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory.UltmarcTableMapperFactoryを通じて、テスト対象のマッパークラスを生成して返す
|
||||
|
||||
### assert_table_results
|
||||
|
||||
- 引数
|
||||
- actual_rows: list[dict] テスト結果の辞書リスト
|
||||
- expect_rows: list[dict] 期待値の辞書リスト
|
||||
- ignore_col_name: list 比較を無視するDBのカラム名. Default None.
|
||||
- 戻り値
|
||||
- なし
|
||||
- 処理概要
|
||||
- テスト結果データと期待値データを突き合わせ、期待値どおりとなっているかを確認する
|
||||
- ignore_col_nameに指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする
|
||||
|
||||
## フォルダ構成
|
||||
|
||||
```text
|
||||
.
|
||||
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
|
||||
├── Dockerfile -- Dockerイメージを作成するためのファイル
|
||||
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
|
||||
├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル
|
||||
├── README.md -- 当ファイル
|
||||
├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル
|
||||
├── src -- ソースコードの保管場所
|
||||
│ ├── aws -- AWS関連処理
|
||||
│ │ └── s3.py -- S3クライアントとバケット処理
|
||||
│ ├── batch -- バッチ処理関連ソース置き場
|
||||
│ │ ├── batch_functions.py -- バッチ処理共通関数置き場
|
||||
│ │ ├── datachange -- 実績洗替関連ソース置き場
|
||||
│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替
|
||||
│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント
|
||||
│ │ └── ultmarc -- アルトマーク関連処理
|
||||
│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント
|
||||
│ │ ├── datfile.py -- データファイル読込
|
||||
│ │ └── utmp_tables -- アルトマークテーブルへの登録関連
|
||||
│ │ ├── table_mapper -- テーブルへのデータマッピング処理
|
||||
│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分)
|
||||
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
|
||||
├── Dockerfile -- Dockerイメージを作成するためのファイル
|
||||
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
|
||||
├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル
|
||||
├── README.md -- 当ファイル
|
||||
├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル
|
||||
├── src -- ソースコードの保管場所
|
||||
│ ├── aws -- AWS関連処理
|
||||
│ │ └── s3.py -- S3クライアントとバケット処理
|
||||
│ ├── batch -- バッチ処理関連ソース置き場
|
||||
│ │ ├── batch_functions.py -- バッチ処理共通関数置き場
|
||||
│ │ ├── datachange -- 実績洗替関連ソース置き場
|
||||
│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替
|
||||
│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント
|
||||
│ │ └── ultmarc -- アルトマーク関連処理
|
||||
│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント
|
||||
│ │ ├── datfile.py -- データファイル読込
|
||||
│ │ └── utmp_tables -- アルトマークテーブルへの登録関連
|
||||
│ │ ├── table_mapper -- テーブルへのデータマッピング処理
|
||||
│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分)
|
||||
│ │ │ │ ├── com_alma_mapper.py
|
||||
│ │ │ │ ├── ...
|
||||
│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス
|
||||
│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス
|
||||
│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分)
|
||||
│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス
|
||||
│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス
|
||||
│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分)
|
||||
│ │ │ ├── com_alma.py
|
||||
│ │ │ ├── ...
|
||||
│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス
|
||||
│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス
|
||||
│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス
|
||||
│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス
|
||||
│ ├── db
|
||||
│ │ └── database.py -- データベース操作共通処理
|
||||
│ │ └── database.py -- データベース操作共通処理
|
||||
│ ├── error
|
||||
│ │ └── exceptions.py -- カスタム例外
|
||||
│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
|
||||
│ │ └── exceptions.py -- カスタム例外
|
||||
│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
|
||||
│ ├── logging
|
||||
│ │ └── get_logger.py -- ログ出力の共通処理
|
||||
│ │ └── get_logger.py -- ログ出力の共通処理
|
||||
│ ├── system_var
|
||||
│ │ └── environment.py -- 環境変数
|
||||
│ │ └── environment.py -- 環境変数
|
||||
│ └── time
|
||||
│ └── elapsed_time.py -- 実行時間計測用
|
||||
│ └── elapsed_time.py -- 実行時間計測用
|
||||
└── tests -- ユニットテストのルートディレクト
|
||||
├── batch
|
||||
│ └── ultmarc -- アルトマーク関連のユニットテストを格納する
|
||||
│ └── utmp_tables
|
||||
│ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る
|
||||
│ └── com_alma
|
||||
│ ├── test_com_alma_mapper.py -- テストコード本体
|
||||
│ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。
|
||||
│ ...
|
||||
│ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。
|
||||
│ ...
|
||||
│ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。
|
||||
│ ...
|
||||
├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ)
|
||||
└── testing_utility.py -- テストの共通関数
|
||||
```
|
||||
|
||||
@ -3,6 +3,8 @@ import tempfile
|
||||
|
||||
import boto3
|
||||
|
||||
from src.system_var import environment
|
||||
|
||||
|
||||
class S3Client:
|
||||
__s3_client = boto3.client('s3')
|
||||
@ -16,13 +18,12 @@ class S3Client:
|
||||
# 末尾がスラッシュで終わるものはフォルダとみなしてスキップする
|
||||
objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')]
|
||||
return objects
|
||||
|
||||
|
||||
def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None:
|
||||
copy_source = {'Bucket': src_bucket, 'Key': src_key}
|
||||
self.__s3_client.copy(copy_source, dest_bucket, dest_key)
|
||||
return
|
||||
|
||||
|
||||
def download_file(self, bucket_name: str, file_key: str, file):
|
||||
self.__s3_client.download_fileobj(
|
||||
Bucket=bucket_name,
|
||||
@ -31,50 +32,53 @@ class S3Client:
|
||||
)
|
||||
return
|
||||
|
||||
|
||||
def upload_file(self, local_file_path: str, bucket_name: str, file_key: str):
|
||||
self.__s3_client.upload_file(
|
||||
local_file_path,
|
||||
Bucket=bucket_name,
|
||||
Key=file_key
|
||||
)
|
||||
local_file_path,
|
||||
Bucket=bucket_name,
|
||||
Key=file_key
|
||||
)
|
||||
|
||||
def delete_file(self, bucket_name: str, file_key: str):
|
||||
self.__s3_client.delete_object(
|
||||
Bucket=bucket_name,
|
||||
Key=file_key
|
||||
)
|
||||
|
||||
|
||||
class S3Bucket():
|
||||
_s3_client = S3Client()
|
||||
_bucket_name: str = None
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self._bucket_name
|
||||
|
||||
class UltmarcBucket(S3Bucket):
|
||||
# TODO: 環境変数にする
|
||||
_bucket_name = 'mbj-newdwh2021-staging-jskult-ultmarc'
|
||||
_folder = 'recv'
|
||||
_bucket_name = environment.ULTMARC_DATA_BUCKET
|
||||
_folder = environment.ULTMARC_DATA_FOLDER
|
||||
|
||||
def list_edi_file(self):
|
||||
def list_dat_file(self):
|
||||
return self._s3_client.list_objects(self._bucket_name, self._folder)
|
||||
|
||||
def download_edi_file(self, edi_filename: str):
|
||||
|
||||
def download_dat_file(self, dat_filename: str):
|
||||
# 一時ファイルとして保存する
|
||||
temporary_dir = tempfile.mkdtemp()
|
||||
temporary_file_path = path.join(temporary_dir, f'{edi_filename.replace("recv/", "")}')
|
||||
temporary_file_path = path.join(temporary_dir, f'{dat_filename.replace(f"{self._folder}/", "")}')
|
||||
with open(temporary_file_path, mode='wb') as f:
|
||||
self._s3_client.download_file(self._bucket_name, edi_filename, f)
|
||||
self._s3_client.download_file(self._bucket_name, dat_filename, f)
|
||||
f.seek(0)
|
||||
return temporary_file_path
|
||||
|
||||
def backup_edi_file(self, edi_file_key: str, datetime_key: str):
|
||||
|
||||
def backup_dat_file(self, dat_file_key: str, datetime_key: str):
|
||||
ultmarc_backup_bucket = UltmarcBackupBucket()
|
||||
backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{edi_file_key.replace(f"{self._folder}/", "")}'
|
||||
self._s3_client.copy(str(self), edi_file_key, str(ultmarc_backup_bucket), backup_key)
|
||||
backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}'
|
||||
self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key)
|
||||
|
||||
def delete_dat_file(self, dat_file_key: str):
|
||||
self._s3_client.delete_file(self._bucket_name, dat_file_key)
|
||||
|
||||
|
||||
class JskUltBackupBucket(S3Bucket):
|
||||
# TODO: 環境変数にする
|
||||
_bucket_name = 'mbj-newdwh2021-staging-jskult-backup'
|
||||
_bucket_name = environment.ULTMARC_BACKUP_BUCKET
|
||||
|
||||
|
||||
class UltmarcBackupBucket(JskUltBackupBucket):
|
||||
# TODO: 環境変数にする
|
||||
_folder = 'ultmarc'
|
||||
_folder = environment.ULTMARC_BACKUP_FOLDER
|
||||
|
||||
@ -53,4 +53,4 @@ def logging_sql(logger, sql):
|
||||
logger (logging.Logger): ロガー
|
||||
sql (str): SQL文
|
||||
"""
|
||||
logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}')
|
||||
logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}')
|
||||
|
||||
@ -5,6 +5,6 @@ class BatchConfig:
|
||||
|
||||
@classmethod
|
||||
def get_instance(cls):
|
||||
if cls.__instance == None:
|
||||
if cls.__instance is None:
|
||||
cls.__instance = cls()
|
||||
return cls.__instance
|
||||
|
||||
@ -4,16 +4,16 @@ from io import TextIOWrapper
|
||||
|
||||
class DatFileLine:
|
||||
layout_class: str
|
||||
record_id: str
|
||||
records: list[str]
|
||||
|
||||
def __init__(self, dat_line: list[str]) -> None:
|
||||
self.layout_class = dat_line[0]
|
||||
self.record_id = dat_line[1]
|
||||
self.records = dat_line
|
||||
|
||||
|
||||
class DatFile:
|
||||
"""アルトマークデータファイル"""
|
||||
|
||||
lines: list[DatFileLine]
|
||||
success_count: int = 0
|
||||
error_count: int = 0
|
||||
@ -45,6 +45,14 @@ class DatFile:
|
||||
|
||||
@classmethod
|
||||
def from_path(cls, local_file_path: str):
|
||||
"""アルトマークデータファイルを読み込み、新しいインスタンスを作成する
|
||||
|
||||
Args:
|
||||
local_file_path (str): ローカルのファイルパス
|
||||
|
||||
Returns:
|
||||
DatFile: このクラスのインスタンス
|
||||
"""
|
||||
# cp932(Shift-JIS Windows拡張)でファイルを読み込む
|
||||
file = open(local_file_path, encoding='cp932')
|
||||
instance = cls(file)
|
||||
|
||||
@ -1,89 +1,99 @@
|
||||
"""アルトマークデータ保管"""
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from src.aws.s3 import UltmarcBucket
|
||||
from src.batch.common.batch_config import BatchConfig
|
||||
from src.batch.ultmarc.datfile import DatFile
|
||||
from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \
|
||||
UltmarcTableMapperFactory
|
||||
from src.db.database import Database
|
||||
from src.error.exceptions import DBException
|
||||
from src.logging.get_logger import get_logger
|
||||
|
||||
logger = get_logger('アルトマークデータ保管')
|
||||
ultmarc_bucket = UltmarcBucket()
|
||||
batch_config = BatchConfig.get_instance()
|
||||
|
||||
|
||||
def batch_process():
|
||||
def exec_import():
|
||||
"""アルトマーク取り込み処理"""
|
||||
try:
|
||||
logger.info('datInsert START')
|
||||
# DBセットアップ
|
||||
db = Database.get_instance()
|
||||
db.connect()
|
||||
# ファイル単位でトランザクションを行う
|
||||
db.begin()
|
||||
logger.info('Transaction BEGIN')
|
||||
logger.info('アルトマーク取込処理: 開始')
|
||||
# datファイルをS3から取得する
|
||||
dat_file_list = ultmarc_bucket.list_edi_file()
|
||||
dat_file_list = ultmarc_bucket.list_dat_file()
|
||||
|
||||
# ファイルがない場合は処理せず、正常終了とする
|
||||
if len(dat_file_list) == 0:
|
||||
logger.info('ファイルがないため、処理をスキップします')
|
||||
logger.info('ファイルがないため、アルトマーク取込処理をスキップします')
|
||||
return
|
||||
|
||||
# ファイルが複数ある場合はエラーとする
|
||||
if len(dat_file_list) > 1:
|
||||
logger.error('複数の取込ファイルがあるため、異常終了')
|
||||
logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}')
|
||||
return
|
||||
|
||||
# ファイルの件数は必ず1件になる
|
||||
dat_file_info = dat_file_list[0]
|
||||
# 0Byteの場合、
|
||||
if dat_file_info['size'] == 0:
|
||||
logger.info('0Byteファイルのため、処理をスキップします')
|
||||
logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}')
|
||||
return
|
||||
|
||||
dat_file_name = dat_file_info['filename']
|
||||
logger.info(f"Get File Name :{dat_file_name}")
|
||||
now = datetime.now().strftime('%Y/%m/%d')
|
||||
logger.info(f"{dat_file_name}を取り込みます")
|
||||
# ファイルをバックアップ
|
||||
# 現行は、jobctrl_dailyの先頭でやっている
|
||||
ultmarc_bucket.backup_edi_file(dat_file_name, now)
|
||||
ultmarc_bucket.backup_dat_file(dat_file_name, batch_config.syor_date)
|
||||
# datファイルをダウンロード
|
||||
local_file_path = ultmarc_bucket.download_edi_file(dat_file_name)
|
||||
|
||||
mapper_factory = UltmarcTableMapperFactory()
|
||||
local_file_path = ultmarc_bucket.download_dat_file(dat_file_name)
|
||||
dat_file = DatFile.from_path(local_file_path)
|
||||
# datファイルを1行ずつ処理し、各テーブルへ登録
|
||||
for log_count, line in enumerate(dat_file):
|
||||
try:
|
||||
# 書き込み先のテーブルを特定
|
||||
mapper_class = mapper_factory.create(
|
||||
line.layout_class,
|
||||
line.record_id,
|
||||
line.records,
|
||||
db
|
||||
)
|
||||
mapper_class.make_query()
|
||||
mapper_class.execute_queries()
|
||||
dat_file.count_up_success()
|
||||
# 5000件ごとにログ記録
|
||||
# これいる??
|
||||
if log_count % 5000 == 0:
|
||||
logger.info(f'Count: {log_count}')
|
||||
except DBException as e:
|
||||
logger.warning(e)
|
||||
record = line.records
|
||||
log_message = ','.join([f'"{r}"' for r in record])
|
||||
logger.warning(log_message)
|
||||
dat_file.count_up_error()
|
||||
# すべての行を登録終えたらコミットする
|
||||
db.commit()
|
||||
logger.info('Transaction COMMIT')
|
||||
logger.info(f'datInsert RESULT')
|
||||
logger.info(f'SUCCESS_COUNT={dat_file.success_count}')
|
||||
logger.info(f'ERROR_COUNT={dat_file.error_count}')
|
||||
logger.info(f'ALL_COUNT={dat_file.total_count}')
|
||||
# アルトマーク取り込み実行
|
||||
_import_to_ultmarc_table(dat_file)
|
||||
# 処理後、ファイルをS3から削除する
|
||||
logger.info(f'取り込み処理が完了したため、datファイルを削除。ファイル名={dat_file_name}')
|
||||
ultmarc_bucket.delete_dat_file(dat_file_name)
|
||||
except Exception as e:
|
||||
logger.exception(e)
|
||||
raise e
|
||||
finally:
|
||||
db.disconnect()
|
||||
logger.info('終了')
|
||||
logger.info('アルトマーク取込処理: 終了')
|
||||
|
||||
|
||||
def _import_to_ultmarc_table(dat_file: DatFile):
|
||||
db = Database.get_instance()
|
||||
# DB接続
|
||||
db.connect()
|
||||
# ファイル単位でトランザクションを行う
|
||||
db.begin()
|
||||
logger.info('Transaction BEGIN')
|
||||
mapper_factory = UltmarcTableMapperFactory()
|
||||
# datファイルを1行ずつ処理し、各テーブルへ登録
|
||||
for line in dat_file:
|
||||
try:
|
||||
# 書き込み先のテーブルを特定
|
||||
mapper_class = mapper_factory.create(
|
||||
line.layout_class,
|
||||
line.records,
|
||||
db
|
||||
)
|
||||
mapper_class.make_query()
|
||||
mapper_class.execute_queries()
|
||||
dat_file.count_up_success()
|
||||
except Exception as e:
|
||||
logger.warning(e)
|
||||
record = line.records
|
||||
log_message = ','.join([f'"{r}"' for r in record])
|
||||
logger.warning(f'ERROR_LINE: {log_message}')
|
||||
dat_file.count_up_error()
|
||||
# すべての行を登録終えたらコミットする
|
||||
db.commit()
|
||||
db.disconnect()
|
||||
# 処理結果をログに出力する
|
||||
logger.info('Transaction COMMIT')
|
||||
logger.info(f'ultmarc import process RESULT')
|
||||
logger.info(f'SUCCESS_COUNT={dat_file.success_count}')
|
||||
logger.info(f'ERROR_COUNT={dat_file.error_count}')
|
||||
logger.info(f'ALL_COUNT={dat_file.total_count}')
|
||||
|
||||
# 1件でもエラーがあれば、通知用にログに出力する
|
||||
if dat_file.error_count > 0:
|
||||
logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。')
|
||||
return
|
||||
|
||||
@ -206,7 +206,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper):
|
||||
if self.record.notdm_flg != '':
|
||||
notdm_flg = None if self.record.notdm_flg == '@' else self.record.notdm_flg
|
||||
self.query_parameter['notdm_flg'] = notdm_flg
|
||||
set_clause_without_historical.append(f'notdm_flg = {"NULL" if notdm_flg is None else ":notdm_flg"}')
|
||||
set_clause_without_historical.append(f'notdm_flg = :notdm_flg')
|
||||
# 何かしら更新がある場合、履歴作成クエリを作成
|
||||
if len(set_clauses_with_historical) != 0:
|
||||
make_history_query = self.TO_HISTORY_QUERY
|
||||
@ -242,12 +242,12 @@ class ComDrWrkplaceMapper(UltmarcTableMapper):
|
||||
# 所属部科(カナ)
|
||||
sectname_kana = None if self.record.sectname_kana == '@' else self.record.sectname_kana
|
||||
self.query_parameter['sectname_kana'] = sectname_kana
|
||||
set_clauses.append(f'blng_sec_name_kana = {"NULL" if sectname_kana is None else ":sectname_kana"}')
|
||||
set_clauses.append(f'blng_sec_name_kana = :sectname_kana')
|
||||
# 所属部科(漢字)
|
||||
# 全角文字なので、修正項目として全角@が連携されるパターンがある
|
||||
sectname = None if self.record.sectname == '@' else self.record.sectname
|
||||
self.query_parameter['sectname'] = sectname
|
||||
set_clauses.append(f'blng_sec_name = {"NULL" if sectname is None else ":sectname"}')
|
||||
set_clauses.append(f'blng_sec_name = :sectname')
|
||||
|
||||
# 何かしら更新がある場合、適用開始日をセットする
|
||||
if len(set_clauses) != 0:
|
||||
|
||||
@ -10,6 +10,8 @@ batch_config = BatchConfig.get_instance()
|
||||
|
||||
|
||||
class UltmarcTableMapper(metaclass=ABCMeta):
|
||||
"""アルトマークテーブルへの登録処理の抽象クラス"""
|
||||
|
||||
record: UltmarcTable
|
||||
db: Database
|
||||
queries: list[str]
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
class UltmarcTable:
|
||||
|
||||
"""アルトマーク関連テーブルの抽象クラス"""
|
||||
record: list
|
||||
|
||||
def __init__(self, record: list):
|
||||
self.record = record
|
||||
|
||||
|
||||
def to_sql_parameter(self):
|
||||
return vars(self)
|
||||
|
||||
@ -9,33 +9,32 @@ from src.db.database import Database
|
||||
COM_TABLE_LIST = {
|
||||
# レコードID固定
|
||||
# COM_医師学会
|
||||
"521": {"01": null_mapper.NullMapper},
|
||||
# TODO: 入れ子にしない
|
||||
"521": null_mapper.NullMapper,
|
||||
# COM_施設属性
|
||||
"111": {"00": null_mapper.NullMapper},
|
||||
"111": null_mapper.NullMapper,
|
||||
# COM_臨床研修病院
|
||||
"112": {"00": null_mapper.NullMapper},
|
||||
"112": null_mapper.NullMapper,
|
||||
# COM_医師
|
||||
"501": {"01": null_mapper.NullMapper},
|
||||
"501": null_mapper.NullMapper,
|
||||
# COM_施設
|
||||
"101": {"00": com_inst_mapper.ComInstMapper},
|
||||
"101": com_inst_mapper.ComInstMapper,
|
||||
# COM_薬局
|
||||
"102": com_pharm_mapper.ComPharmMapper,
|
||||
# COM_医師勤務先
|
||||
"502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper},
|
||||
"502": com_dr_wrkplace_mapper.ComDrWrkplaceMapper,
|
||||
# COM_専門分野
|
||||
"511": {"01": null_mapper.NullMapper},
|
||||
"511": null_mapper.NullMapper,
|
||||
# COM_都道府県医療機能情報(基本)
|
||||
"132": {"00": null_mapper.NullMapper},
|
||||
"132": null_mapper.NullMapper,
|
||||
# COM_都道府県医療機能情報(施設設備)
|
||||
"133": {"00": null_mapper.NullMapper},
|
||||
"133": null_mapper.NullMapper,
|
||||
# COM_都道府県医療機能情報(疾患治療)
|
||||
"134": {"00": null_mapper.NullMapper},
|
||||
"134": null_mapper.NullMapper,
|
||||
# COM_都道府県医療機能情報(短期滞在手術)
|
||||
"135": {"00": null_mapper.NullMapper},
|
||||
"135": null_mapper.NullMapper,
|
||||
# COM_都道府県医療機能情報(専門外来)
|
||||
"136": {"00": null_mapper.NullMapper},
|
||||
|
||||
# レコードID浮動
|
||||
"136": null_mapper.NullMapper,
|
||||
# COM_診療科目
|
||||
"001": null_mapper.NullMapper,
|
||||
# COM_病院種別
|
||||
@ -85,18 +84,24 @@ COM_TABLE_LIST = {
|
||||
|
||||
class UltmarcTableMapperFactory:
|
||||
|
||||
def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper:
|
||||
# レイアウト種別とレコードIDから、マッピング先のテーブルを特定
|
||||
table_by_layout_class = COM_TABLE_LIST.get(layout_class)
|
||||
def create(self, layout_class: str, records: list[str], db: Database) -> UltmarcTableMapper:
|
||||
"""レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する
|
||||
|
||||
# レイアウト種別が特定できない場合はエラーとする
|
||||
if table_by_layout_class is None:
|
||||
raise Exception('特定できませんでした')
|
||||
Args:
|
||||
layout_class (str): レイアウト区分
|
||||
records (list[str]): アルトマークデータの1行
|
||||
db (Database): データベース操作クラス
|
||||
|
||||
mapper_class: UltmarcTableMapper = None
|
||||
if type(table_by_layout_class) is dict:
|
||||
mapper_class = table_by_layout_class.get(record_id)
|
||||
elif issubclass(table_by_layout_class, UltmarcTableMapper):
|
||||
mapper_class = table_by_layout_class
|
||||
Raises:
|
||||
Exception: レイアウトを特定できない場合
|
||||
|
||||
Returns:
|
||||
UltmarcTableMapper: マッパークラス
|
||||
"""
|
||||
# レイアウト区分から、マッピング先のテーブルを特定
|
||||
mapper_class = COM_TABLE_LIST.get(layout_class)
|
||||
# レイアウト区分が特定できない場合はエラーとする
|
||||
if mapper_class is None:
|
||||
raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}')
|
||||
|
||||
return mapper_class(records, db)
|
||||
|
||||
@ -73,7 +73,7 @@ def batch_process():
|
||||
logger.info('日次処理(アルトマーク)実行対象日でない為未実行')
|
||||
try:
|
||||
logger.info('アルトマーク取込:起動')
|
||||
ultmarc_process.batch_process()
|
||||
ultmarc_process.exec_import()
|
||||
logger.info('アルトマーク取込:終了')
|
||||
except BatchOperationException as e:
|
||||
logger.error(f'アルトマーク取込処理エラー(異常終了){e}')
|
||||
|
||||
@ -6,8 +6,16 @@ from src.system_var.environment import LOG_LEVEL
|
||||
for name in ["boto3", "botocore", "s3transfer", "urllib3"]:
|
||||
logging.getLogger(name).setLevel(logging.WARNING)
|
||||
|
||||
# 共通ロガー
|
||||
def get_logger(log_name):
|
||||
|
||||
def get_logger(log_name: str) -> logging.Logger:
|
||||
"""一意のログ出力モジュールを取得します。
|
||||
|
||||
Args:
|
||||
log_name (str): ロガー名
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
logger = logging.getLogger(log_name)
|
||||
level = logging.getLevelName(LOG_LEVEL)
|
||||
if not isinstance(level, int):
|
||||
|
||||
@ -1,12 +1,20 @@
|
||||
import os
|
||||
|
||||
# Database
|
||||
DB_HOST = os.environ['DB_HOST']
|
||||
DB_PORT = int(os.environ['DB_PORT'])
|
||||
DB_USERNAME = os.environ['DB_USERNAME']
|
||||
DB_PASSWORD = os.environ['DB_PASSWORD']
|
||||
DB_SCHEMA = os.environ['DB_SCHEMA']
|
||||
|
||||
LOG_LEVEL = os.environ['LOG_LEVEL']
|
||||
# AWS
|
||||
ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET']
|
||||
ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER']
|
||||
ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET']
|
||||
ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER']
|
||||
|
||||
# 初期値がある環境変数
|
||||
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
|
||||
DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4))
|
||||
DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5))
|
||||
DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5))
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","004","A","20141113","20141114","","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","006","C","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","007","A","20141113","20141114","群馬大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
|
||||
"004","001","A","20141113","20141114","北大"
|
||||
"004","002","A","20141113","20141114","札幌医"
|
||||
"004","003","A","20141113","20141114","弘大"
|
||||
"004","004","A","20141113","20141114",
|
||||
"004","005","A","20141113","20141114","東北大"
|
||||
"004","006","C","20141113","20141114","福島医"
|
||||
"004","007","A","20141113","20141114","群馬大"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","004","A","20141113","20141114","岩手医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","006","A","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","001","A","20141113","20141114","北大"
|
||||
"004","002","A","20141113","20141114","札幌医"
|
||||
"004","003","A","20141113","20141114","弘大"
|
||||
"004","004","A","20141113","20141114","岩手医"
|
||||
"004","005","A","20141113","20141114","東北大"
|
||||
"004","006","A","20141113","20141114","福島医"
|
||||
|
@ -1,7 +1,7 @@
|
||||
"004","001","B","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","002","B","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","003","B","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","004","B","20141113","20141114",,"1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","005","B","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","006","B","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","007","A","20141113","20141114","神大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
|
||||
"004","001","B","20141113","20141114","北大"
|
||||
"004","002","B","20141113","20141114","札幌医"
|
||||
"004","003","B","20141113","20141114","弘大"
|
||||
"004","004","B","20141113","20141114",
|
||||
"004","005","B","20141113","20141114","福島医"
|
||||
"004","006","B","20141113","20141114","東北大"
|
||||
"004","007","A","20141113","20141114","神大"
|
||||
|
@ -88,7 +88,7 @@ class TestComAlmaMapper:
|
||||
COM_出身校テーブルのレコードを更新する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 追加対象となるレコードを登録する
|
||||
- 更新対象となるレコードを登録する
|
||||
Expects:
|
||||
- 登録内容が期待値と一致すること
|
||||
"""
|
||||
@ -145,7 +145,7 @@ class TestComAlmaMapper:
|
||||
COM_出身校テーブルのレコードを1件論理削除する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 追加対象となるレコードを登録する
|
||||
- 削除対象となるレコードを登録する
|
||||
Expects:
|
||||
- 登録内容が期待値と一致すること
|
||||
"""
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
"502","01","997682","","B","00","5408060","","1","20141204","20141206","","","1512","","",""
|
||||
"502","01","997906","","B","00","5409446","","1","20141128","20141206","","","6802","","",""
|
||||
"502","01","997682","","B","00","5412977","","1","20141204","20141206","","","6720","","",""
|
||||
"502","01","995783","","B","00","5414992","","1","20141204","20141206","","","1118","","",""
|
||||
"502","01","997906","","B","00","5503358","","1","20141202","20141206","","","7212","","",""
|
||||
|
@ -0,0 +1,5 @@
|
||||
"502","01","997906","","B","00","5409446","","","20170906","20170910","","","","","","@"
|
||||
"502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","@","@",""
|
||||
"502","01","997682","","A","00","5408060","","","20141113","20141114","","","","","",""
|
||||
"502","01","997682","","B","00","5402984","","","20141113","20141114","165","@","","","",""
|
||||
"502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ",""
|
||||
|
@ -0,0 +1,6 @@
|
||||
"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"1512",,NULL,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-16 22:18:28","clsComBlngSec"
|
||||
"6802","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-30 22:18:48","clsComBlngSec"
|
||||
"6720",,"NULL","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2019-12-23 22:13:44","clsComBlngSec"
|
||||
"1118","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2016-05-17 00:13:18","clsComBlngSec"
|
||||
"7212",,"NULL","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2021-01-11 22:15:40","clsComBlngSec"
|
||||
|
@ -0,0 +1,11 @@
|
||||
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
|
@ -0,0 +1,11 @@
|
||||
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01995783","9112","133","144","2020-02-22","ハツセイ.セイシヨクブモン","発生・生殖部門","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005402984","01997682","1512","165","144","2020-02-22","シヨウカキゲカ","消化器外科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
|
@ -0,0 +1,4 @@
|
||||
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
|
@ -0,0 +1,6 @@
|
||||
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
|
||||
|
@ -0,0 +1,9 @@
|
||||
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"1482023","005408060","01997682","6802","999","144","20200222","シヨウカキゲカガク1","消化器外科学Ⅰ",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
|
||||
"1482024","005409446","01997906","1118","501","999","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
|
||||
"1482025","005412977","01997682","6720","999","144","20200222","シヨウカキゲカガク","消化器外科学",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
|
||||
"1482026","005414992","01995783","9999","501","999","20200222",,,,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
|
||||
"1482027","005503358","01997906","1118","172","144","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
|
||||
|
@ -0,0 +1,4 @@
|
||||
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"1","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門","1","20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"2","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"3","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
|
@ -0,0 +1,11 @@
|
||||
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
|
||||
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
|
||||
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
|
||||
|
@ -1,5 +1,4 @@
|
||||
import os.path as path
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
|
||||
@ -21,19 +20,6 @@ class TestComDrWrkplaceMapper:
|
||||
db: Database
|
||||
batch_config: BatchConfig
|
||||
test_file_path: str = path.dirname(__file__)
|
||||
# dr_wrkplace_table_columns = [
|
||||
# "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd",
|
||||
# "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"]
|
||||
# + create_ultmarc_common_column_names()
|
||||
# # 削除日カラムはないので消す
|
||||
# dr_wrkplace_table_columns.remove('delete_ymd')
|
||||
|
||||
# dr_wrkplace_his_table_columns = [
|
||||
# "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd",
|
||||
# "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \
|
||||
# + create_ultmarc_common_column_names()
|
||||
# # 削除日カラムはないので消す
|
||||
# dr_wrkplace_his_table_columns.remove('delete_ymd')
|
||||
|
||||
@ pytest.fixture(autouse=True, scope='function')
|
||||
def pre_test(self, database: Database):
|
||||
@ -66,7 +52,8 @@ class TestComDrWrkplaceMapper:
|
||||
|
||||
# Arrange
|
||||
# 処理日設定
|
||||
self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d')
|
||||
# 適用開始日と同値になる
|
||||
self.batch_config.syor_date = '2020/02/22'
|
||||
# テスト用のCSVを読み込む
|
||||
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_insert.csv'))
|
||||
# 一旦全データをDBから削除
|
||||
@ -100,9 +87,9 @@ class TestComDrWrkplaceMapper:
|
||||
|
||||
# Assert
|
||||
# 期待値ファイルを読み込む
|
||||
expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv'))
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list]
|
||||
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv'))
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
|
||||
# 複合主キーのため、1件ずつ取得して期待値を作る
|
||||
actual_dr_data_list = []
|
||||
actual_dr_select_sql = """\
|
||||
@ -132,13 +119,272 @@ class TestComDrWrkplaceMapper:
|
||||
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
|
||||
assert len(actual_his_data) == 0, '履歴が作成されていないこと'
|
||||
|
||||
assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
|
||||
|
||||
# 期待値検査
|
||||
ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd']
|
||||
assert_table_results(actual_dr_data_list, expect_data_list, ignore_col_name=ignore_columns)
|
||||
ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date']
|
||||
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=ignore_columns)
|
||||
# 動的日付項目の個別確認
|
||||
line_number = 0
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_data_list):
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
|
||||
line_number += 1
|
||||
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
|
||||
if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date', 'aply_start_ymd']:
|
||||
if actual_col_name in ignore_columns:
|
||||
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
|
||||
|
||||
def test_update_record(self):
|
||||
"""
|
||||
Cases:
|
||||
COM_DCF医師勤務先テーブルのレコードを更新する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 更新対象となるレコードを登録する
|
||||
Expects:
|
||||
- COM_医師勤務先の登録内容が期待値と一致すること
|
||||
- COM_医師勤務先履歴にデータが登録され、期待値と一致すること
|
||||
"""
|
||||
|
||||
# Arrange
|
||||
# 処理日設定
|
||||
# 適用開始日と同値、適用終了日の+1日になる
|
||||
self.batch_config.syor_date = '2020/02/23'
|
||||
# テスト用のCSVを読み込む
|
||||
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_update.csv'))
|
||||
# 一旦全データをDBから削除
|
||||
# COM_医師勤務先
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
# COM_医師勤務先履歴
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
# COM_所属部科
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
|
||||
# COM_医師勤務先を登録
|
||||
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_update.csv'))
|
||||
for test_data in test_sql_data_list:
|
||||
insert_sql, insert_parameter = create_insert_sql_with_parameter(
|
||||
'src05.com_dr_wrkplace',
|
||||
test_data.keys(),
|
||||
test_data.values()
|
||||
)
|
||||
self.db.execute(insert_sql, insert_parameter)
|
||||
|
||||
# Act
|
||||
for line_number, line in enumerate(test_dat_file, start=1):
|
||||
sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db)
|
||||
assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか'
|
||||
|
||||
sut.make_query()
|
||||
sut.execute_queries()
|
||||
|
||||
# Assert
|
||||
# 期待値ファイルを読み込む
|
||||
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_update.csv'))
|
||||
expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_update.csv'))
|
||||
# 複合主キーのため、1件ずつ取得して期待値を作る
|
||||
actual_dr_data_list = []
|
||||
actual_his_data_list = []
|
||||
actual_dr_select_sql = """\
|
||||
SELECT * FROM src05.com_dr_wrkplace
|
||||
WHERE
|
||||
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
|
||||
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\
|
||||
"""
|
||||
actual_his_select_sql = """\
|
||||
SELECT * FROM src05.com_dr_wrkplace_his
|
||||
WHERE
|
||||
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
|
||||
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd
|
||||
"""
|
||||
# COM_医師勤務先の取得
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
|
||||
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
|
||||
actual_dr_data = self.db.execute_select(
|
||||
actual_dr_select_sql,
|
||||
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
|
||||
assert len(actual_dr_data) == 1, '1件取得できていること'
|
||||
actual_dr_data_list.append(actual_dr_data[0])
|
||||
|
||||
# COM_医師勤務先履歴の取得
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list]
|
||||
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
|
||||
actual_his_data = self.db.execute_select(
|
||||
actual_his_select_sql,
|
||||
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
|
||||
assert len(actual_dr_data) == 1, '1件取得できていること'
|
||||
actual_his_data_list.append(actual_his_data[0])
|
||||
|
||||
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
|
||||
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること'
|
||||
|
||||
# 期待値検査
|
||||
# COM_医師勤務先
|
||||
dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date']
|
||||
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns)
|
||||
# 動的日付項目の個別確認
|
||||
line_number = 0
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
|
||||
line_number += 1
|
||||
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
|
||||
if actual_col_name in dr_ignore_columns:
|
||||
if expect_row[expect_col_name] is None:
|
||||
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
|
||||
else:
|
||||
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
|
||||
|
||||
# COM_医師勤務先履歴
|
||||
his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date']
|
||||
assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns)
|
||||
# 動的日付項目の個別確認
|
||||
line_number = 0
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
|
||||
line_number += 1
|
||||
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
|
||||
if actual_col_name in his_ignore_columns:
|
||||
if expect_row[expect_col_name] is None:
|
||||
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
|
||||
else:
|
||||
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
|
||||
|
||||
def test_delete_record(self):
|
||||
"""
|
||||
Cases:
|
||||
COM_DCF医師勤務先テーブルのレコードを削除する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 削除対象となるレコードを登録する
|
||||
Expects:
|
||||
- COM_医師勤務先の登録内容が期待値と一致すること
|
||||
- COM_医師勤務先履歴にデータが登録されないこと
|
||||
"""
|
||||
|
||||
# Arrange
|
||||
# 処理日設定
|
||||
self.batch_config.syor_date = '2020/02/24'
|
||||
# テスト用のCSVを読み込む
|
||||
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_delete.csv'))
|
||||
# 一旦全データをDBから削除
|
||||
# COM_医師勤務先
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
# COM_医師勤務先履歴
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
# COM_所属部科
|
||||
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'})
|
||||
self.db.execute(delete_sql, delete_parameter)
|
||||
|
||||
# COM_医師勤務先を登録
|
||||
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_delete.csv'))
|
||||
for test_data in test_sql_data_list:
|
||||
insert_sql, insert_parameter = create_insert_sql_with_parameter(
|
||||
'src05.com_dr_wrkplace',
|
||||
test_data.keys(),
|
||||
test_data.values()
|
||||
)
|
||||
self.db.execute(insert_sql, insert_parameter)
|
||||
|
||||
# COM_医師勤務先履歴を登録
|
||||
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_his_before_delete.csv'))
|
||||
for test_data in test_sql_data_list:
|
||||
insert_sql, insert_parameter = create_insert_sql_with_parameter(
|
||||
'src05.com_dr_wrkplace_his',
|
||||
test_data.keys(),
|
||||
test_data.values()
|
||||
)
|
||||
self.db.execute(insert_sql, insert_parameter)
|
||||
|
||||
# COM_所属部科を登録
|
||||
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_delete.csv'))
|
||||
for test_data in test_sql_data_list:
|
||||
insert_sql, insert_parameter = create_insert_sql_with_parameter(
|
||||
'src05.com_blng_sec',
|
||||
test_data.keys(),
|
||||
test_data.values()
|
||||
)
|
||||
self.db.execute(insert_sql, insert_parameter)
|
||||
|
||||
# Act
|
||||
for line_number, line in enumerate(test_dat_file, start=1):
|
||||
sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db)
|
||||
assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか'
|
||||
|
||||
sut.make_query()
|
||||
sut.execute_queries()
|
||||
|
||||
# Assert
|
||||
# 期待値ファイルを読み込む
|
||||
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_delete.csv'))
|
||||
expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_delete.csv'))
|
||||
# 複合主キーのため、1件ずつ取得して期待値を作る
|
||||
actual_dr_data_list = []
|
||||
actual_his_data_list = []
|
||||
actual_dr_select_sql = """\
|
||||
SELECT * FROM src05.com_dr_wrkplace
|
||||
WHERE
|
||||
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
|
||||
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\
|
||||
"""
|
||||
actual_his_select_sql = """\
|
||||
SELECT * FROM src05.com_dr_wrkplace_his
|
||||
WHERE
|
||||
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
|
||||
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd
|
||||
"""
|
||||
|
||||
# COM_医師勤務先の取得
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
|
||||
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
|
||||
actual_dr_data = self.db.execute_select(
|
||||
actual_dr_select_sql,
|
||||
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
|
||||
assert len(actual_dr_data) == 1, '1件取得できていること'
|
||||
actual_dr_data_list.append(actual_dr_data[0])
|
||||
|
||||
# COM_医師勤務先履歴の取得
|
||||
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list]
|
||||
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list]
|
||||
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
|
||||
# COM_医師勤務先履歴の取得
|
||||
actual_his_data = self.db.execute_select(
|
||||
actual_his_select_sql,
|
||||
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
|
||||
assert len(actual_his_data) == 1, '1件取得できていること'
|
||||
actual_his_data_list.append(actual_his_data[0])
|
||||
|
||||
assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
|
||||
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること'
|
||||
|
||||
# 期待値検査
|
||||
# COM_医師勤務先
|
||||
dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date']
|
||||
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns)
|
||||
# 動的日付項目の個別確認
|
||||
line_number = 0
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
|
||||
line_number += 1
|
||||
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
|
||||
if actual_col_name in dr_ignore_columns:
|
||||
if expect_row[expect_col_name] is None:
|
||||
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
|
||||
else:
|
||||
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
|
||||
|
||||
# COM_医師勤務先履歴
|
||||
his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date']
|
||||
assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns)
|
||||
# 動的日付項目の個別確認
|
||||
line_number = 0
|
||||
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
|
||||
line_number += 1
|
||||
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
|
||||
if actual_col_name in his_ignore_columns:
|
||||
if expect_row[expect_col_name] is None:
|
||||
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
|
||||
else:
|
||||
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
"021","001","","A","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","007","2","A","20141113","20141114","重症肥満の外科治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","001",,"A","20141113","20141114",
|
||||
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
|
||||
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
|
||||
"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
|
||||
"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
|
||||
"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断"
|
||||
"021","007","2","A","20141113","20141114","重症肥満の外科治療法"
|
||||
|
@ -1,6 +1,6 @@
|
||||
"021","001","2","A","20141113","20141114","直流電流による骨電気治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","001","2","A","20141113","20141114","直流電流による骨電気治療法"
|
||||
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
|
||||
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
|
||||
"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
|
||||
"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断"
|
||||
"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
|
||||
|
@ -1,6 +1,6 @@
|
||||
"021","001","","B","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
|
||||
"021","001",,"B","20141113","20141114",
|
||||
"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
|
||||
"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
|
||||
"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
|
||||
"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
|
||||
"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断"
|
||||
|
@ -89,7 +89,7 @@ class TestComHamtecMapper:
|
||||
COM_高度先進医療テーブルのレコードを更新する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 追加対象となるレコードを登録する
|
||||
- 更新対象となるレコードを登録する
|
||||
Expects:
|
||||
- 登録内容が期待値と一致すること
|
||||
"""
|
||||
@ -146,7 +146,7 @@ class TestComHamtecMapper:
|
||||
COM_高度先進医療テーブルのレコードを1件論理削除する
|
||||
Arranges:
|
||||
- CSVデータを用意し、読み込む
|
||||
- 追加対象となるレコードを登録する
|
||||
- 削除対象となるレコードを登録する
|
||||
Expects:
|
||||
- 登録内容が期待値と一致すること
|
||||
"""
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
"""共通テストフィクスチャ"""
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
|
||||
from src.db.database import Database
|
||||
@ -11,15 +9,3 @@ from src.db.database import Database
|
||||
def database() -> Database:
|
||||
"""データベース接続モジュールを作成"""
|
||||
return Database.get_instance()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def expect_datetime() -> datetime:
|
||||
"""テスト実行年月日時分秒を生成"""
|
||||
return datetime.now().replace(microsecond=0)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def expect_date_str(expect_datetime: datetime) -> str:
|
||||
"""テスト実行年月日の文字8桁を生成"""
|
||||
return expect_datetime.strftime('%Y%m%d')
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
"""テスト用共通処理関数"""
|
||||
import csv
|
||||
import io
|
||||
import tempfile
|
||||
from datetime import datetime
|
||||
from types import ModuleType
|
||||
|
||||
from src.batch.ultmarc.datfile import DatFile, DatFileLine
|
||||
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
|
||||
@ -69,44 +67,6 @@ def create_db_data_from_csv(file_path: str) -> list[dict]:
|
||||
return rows
|
||||
|
||||
|
||||
def create_ultmarc_test_csv(csv_rows: list[str]) -> DatFile:
|
||||
"""アルトマーク取込テストのCSVを作成
|
||||
Args:
|
||||
csv_rows (tuple[str]): CSV文字列のリスト
|
||||
Returns:
|
||||
list[list[str]]: CSVデータ
|
||||
"""
|
||||
string_io = io.StringIO()
|
||||
for csv_row in csv_rows:
|
||||
string_io.write(csv_row)
|
||||
string_io.write('\n')
|
||||
string_io.seek(0)
|
||||
dat_file = DatFile(string_io)
|
||||
|
||||
return dat_file
|
||||
|
||||
|
||||
def create_ultmarc_common_column_names() -> list[str]:
|
||||
"""アルトマークテーブル共通のカラム名を作成
|
||||
Returns:
|
||||
list[str]: 共通カラム名
|
||||
"""
|
||||
|
||||
return [
|
||||
'regist_ymd',
|
||||
'update_ymd',
|
||||
'delete_ymd',
|
||||
'regist_date',
|
||||
'create_user',
|
||||
'update_date',
|
||||
'update_user',
|
||||
'sys_regist_date',
|
||||
'regist_prgm_id',
|
||||
'sys_update_date',
|
||||
'update_prgm_id'
|
||||
]
|
||||
|
||||
|
||||
def create_insert_sql_with_parameter(table_name: str, column_names: list[str], test_data: list[str]) -> tuple[str, dict]:
|
||||
"""INSERT文と登録値のパラメータを返す
|
||||
|
||||
@ -144,41 +104,6 @@ def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str
|
||||
return delete_sql, delete_parameter
|
||||
|
||||
|
||||
def create_ultmarc_common_column_values(**kwargs) -> list:
|
||||
"""アルトマークテーブル共通のカラムを作成
|
||||
|
||||
Args:
|
||||
kwargs 有効なキー一覧
|
||||
regist_ymd (str): 登録年月日
|
||||
update_ymd (str): 更新年月日
|
||||
delete_ymd (str): 削除年月日
|
||||
regist_date (datetime): 登録日時
|
||||
create_user (str): 登録者
|
||||
update_date (datetime): 更新日時
|
||||
update_user (str): 更新者
|
||||
sys_regist_date (datetime): システム登録日時
|
||||
regist_prgm_id (str): 登録プログラムid
|
||||
sys_update_date (datetime): システム更新日時
|
||||
update_prgm_id (str): 更新プログラムid
|
||||
Returns:
|
||||
list: 共通カラム値
|
||||
"""
|
||||
|
||||
return [
|
||||
kwargs.get('regist_ymd'), # 登録年月日(regist_ymd)
|
||||
kwargs.get('update_ymd'), # 更新年月日(update_ymd)
|
||||
kwargs.get('delete_ymd'), # 削除年月日(delete_ymd)
|
||||
kwargs.get('regist_date'), # 登録日時(regist_date)
|
||||
kwargs.get('create_user'), # 登録者(create_user)
|
||||
kwargs.get('update_date'), # 更新日時(update_date)
|
||||
kwargs.get('update_user'), # 更新者(update_user)
|
||||
kwargs.get('sys_regist_date'), # システム登録日時(sys_regist_date)
|
||||
kwargs.get('regist_prgm_id'), # 登録プログラムid(regist_prgm_id)
|
||||
kwargs.get('sys_update_date'), # システム更新日時(sys_update_date)
|
||||
kwargs.get('update_prgm_id') # 更新プログラムid(update_prgm_id)
|
||||
]
|
||||
|
||||
|
||||
def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcTableMapper:
|
||||
"""アルトマークテーブルマッパーのインスタンスを返す
|
||||
|
||||
@ -190,11 +115,9 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT
|
||||
UltmarcTableMapper: マッパークラス
|
||||
"""
|
||||
layout_class = line.layout_class
|
||||
record_id = line.record_id
|
||||
factory = UltmarcTableMapperFactory()
|
||||
sut = factory.create(
|
||||
layout_class=layout_class,
|
||||
record_id=record_id,
|
||||
records=line.records,
|
||||
db=db
|
||||
)
|
||||
@ -202,18 +125,6 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT
|
||||
return sut
|
||||
|
||||
|
||||
def get_module_name(module: ModuleType) -> str:
|
||||
"""登録プログラムID、更新プログラムIDに登録するモジュール名を作成
|
||||
|
||||
Args:
|
||||
module (ModuleType): pythonモジュール
|
||||
|
||||
Returns:
|
||||
str: モジュール名
|
||||
"""
|
||||
return module.__name__.split('.')[-1]
|
||||
|
||||
|
||||
def is_valid_date_format(date_str: str, date_format):
|
||||
"""日付文字列が、与えられたフォーマットにマッチするかを検査する
|
||||
|
||||
@ -237,6 +148,7 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor
|
||||
Args:
|
||||
actual_rows (list[dict]): テスト結果の辞書リスト
|
||||
expect_rows (list[dict]): 期待値の辞書リスト
|
||||
ignore_col_name (list): 比較を無視するDBのカラム名. Default None.
|
||||
"""
|
||||
# 取得件数が一致すること
|
||||
assert len(actual_rows) == len(expect_rows)
|
||||
|
||||
@ -6,7 +6,7 @@ CRLF
|
||||
1
|
||||
12
|
||||
対象期間,クラスターコード,クラスター名,都道府県コード,都道府県名,施設コード,施設名,更新日,更新事由,適用年月,セグメントコード,セグメント名
|
||||
data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_coce,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name
|
||||
data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_code,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name
|
||||
src01.en_clufm_clumst
|
||||
org01.en_clufm_clumst
|
||||
CLUFM_CLUMST_ex.sql
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user