diff --git a/.gitignore b/.gitignore index edc232ea..bbfbbcbe 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ stepfunctions/*/build # python test .coverage .report/ + +# log +.log \ No newline at end of file diff --git a/ecs/crm-datafetch/.gitignore b/ecs/crm-datafetch/.gitignore new file mode 100644 index 00000000..bbfbbcbe --- /dev/null +++ b/ecs/crm-datafetch/.gitignore @@ -0,0 +1,20 @@ +# Node.jsで実装されたLambdaの管理対象外ファイル群 +package-lock.json +node_modules/ +# ローカル確認用環境変数ファイル +.env +# Pythonの仮想環境ファイル +.venv +# pythonのキャッシュファイル +__pycache__/ + +# StepFunctionsステートメント定義変換後のフォルダ +stepfunctions/*/build +**/.vscode/settings.json + +# python test +.coverage +.report/ + +# log +.log \ No newline at end of file diff --git a/ecs/crm-datafetch/Dockerfile b/ecs/crm-datafetch/Dockerfile index e4de29ce..b885fe02 100644 --- a/ecs/crm-datafetch/Dockerfile +++ b/ecs/crm-datafetch/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8 +FROM python:3.9 ENV TZ="Asia/Tokyo" diff --git a/ecs/crm-datafetch/Pipfile b/ecs/crm-datafetch/Pipfile index da57afc8..51d5c180 100644 --- a/ecs/crm-datafetch/Pipfile +++ b/ecs/crm-datafetch/Pipfile @@ -11,7 +11,7 @@ test = "pytest tests/" [packages] boto3 = "*" -simple-salesforce = "*" +simple-salesforce = "==1.12.4" tenacity = "*" [dev-packages] @@ -23,4 +23,4 @@ pytest-html = "*" moto = "*" [requires] -python_version = "3.8" +python_version = "3.9" diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index b1423ff9..dcb85854 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "7006de596d6123ecd56760b584ab75430fa6bcfc0ecd3fdf49f08368ff53477d" + "sha256": "79301fd70f05a7e9d84a96c82c8ca7d17d7c476a666f204bbde8ac46acf2c400" }, "pipfile-spec": 6, "requires": { - "python_version": "3.8" + "python_version": "3.9" }, "sources": [ { @@ -18,137 +18,236 @@ "default": { "attrs": { "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" + "markers": "python_version >= '3.7'", + "version": "==23.2.0" }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.26.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], - "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2024.2.2" + }, + "cffi": { + "hashes": [ + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.16.0" }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "cryptography": { + "hashes": [ + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" + ], + "markers": "python_version >= '3.7'", + "version": "==42.0.5" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "isodate": { "hashes": [ @@ -167,156 +266,164 @@ }, "lxml": { "hashes": [ - "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7", - "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726", - "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03", - "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140", - "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a", - "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05", - "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03", - "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419", - "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4", - "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e", - "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67", - "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50", - "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894", - "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf", - "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947", - "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1", - "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd", - "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3", - "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92", - "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3", - "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457", - "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74", - "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf", - "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1", - "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4", - "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975", - "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5", - "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe", - "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7", - "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1", - "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2", - "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409", - "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f", - "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f", - "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5", - "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24", - "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e", - "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4", - "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a", - "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c", - "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de", - "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f", - "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b", - "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5", - "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7", - "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a", - "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c", - "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9", - "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e", - "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab", - "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941", - "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5", - "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45", - "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7", - "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892", - "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746", - "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c", - "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53", - "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe", - "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184", - "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38", - "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df", - "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9", - "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b", - "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2", - "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0", - "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda", - "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b", - "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5", - "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380", - "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33", - "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8", - "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1", - "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889", - "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9", - "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f", - "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c" + "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01", + "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f", + "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1", + "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431", + "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8", + "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623", + "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a", + "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1", + "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6", + "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67", + "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890", + "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372", + "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c", + "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb", + "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df", + "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84", + "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6", + "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45", + "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936", + "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca", + "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897", + "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a", + "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d", + "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14", + "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912", + "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354", + "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f", + "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c", + "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d", + "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862", + "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969", + "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e", + "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8", + "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e", + "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa", + "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45", + "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a", + "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147", + "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3", + "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3", + "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324", + "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3", + "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33", + "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f", + "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f", + "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764", + "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1", + "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114", + "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581", + "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d", + "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae", + "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da", + "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2", + "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e", + "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda", + "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5", + "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa", + "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1", + "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e", + "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7", + "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1", + "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95", + "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93", + "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5", + "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b", + "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05", + "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5", + "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f", + "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7", + "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8", + "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea", + "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa", + "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd", + "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b", + "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e", + "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4", + "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204", + "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.2" + "markers": "python_version >= '3.6'", + "version": "==5.1.0" }, "platformdirs": { "hashes": [ - "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490", - "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2" + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], - "markers": "python_version >= '3.7'", - "version": "==2.6.2" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" }, "pyjwt": { "hashes": [ - "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", - "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "markers": "python_version >= '3.7'", - "version": "==2.6.0" + "version": "==2.8.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "pytz": { "hashes": [ - "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", - "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "version": "==2022.7.1" + "version": "==2024.1" }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.28.2" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" }, "requests-file": { "hashes": [ - "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e", - "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953" + "sha256:20c5931629c558fda566cacc10cfe2cd502433e628f568c34c80d96a0cc95972", + "sha256:3e493d390adb44aa102ebea827a48717336d5268968c370eaf19abaf5cae13bf" ], - "version": "==1.5.1" + "version": "==2.0.0" }, "requests-toolbelt": { "hashes": [ - "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7", - "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d" + "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.1" + "version": "==1.0.0" }, "s3transfer": { "hashes": [ - "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd", - "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.6.0" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "simple-salesforce": { "hashes": [ - "sha256:e46306bb9820fe3036c8873a6ee6b806be9471cca1b454ae24c585784a64b20b", - "sha256:ff4ca9ae31d1f378fb0dce6e222b91ab6254d3dd5b0062c137822a822517e189" + "sha256:87f1ac1363987ebf9b7a66ac9e7395534ec3f5a9545e08b664cb695dc085b1ac", + "sha256:e9205f8041226c8273f020448c7fbd37999d481d25edd67f9bf86dc159cd3939" ], "index": "pypi", - "version": "==1.12.3" + "version": "==1.12.4" }, "six": { "hashes": [ @@ -328,19 +435,20 @@ }, "tenacity": { "hashes": [ - "sha256:35525cd47f82830069f0d6b73f7eb83bc5b73ee2fff0437952cedf98b27653ac", - "sha256:e48c437fdf9340f5666b92cd7990e96bc5fc955e1298baf4a907e3972067a445" + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", - "version": "==8.1.0" + "markers": "python_version >= '3.7'", + "version": "==8.2.3" }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version < '3.10'", + "version": "==1.26.18" }, "zeep": { "hashes": [ @@ -352,321 +460,317 @@ } }, "develop": { - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" - }, "autopep8": { "hashes": [ - "sha256:be5bc98c33515b67475420b7b1feafc8d32c1a69862498eda4983b45bffd2687", - "sha256:d27a8929d8dcd21c0f4b3859d2d07c6c25273727b98afc984c039df0f0d86566" + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", - "version": "==2.0.1" + "markers": "python_version >= '3.6'", + "version": "==2.0.4" }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.26.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], - "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2024.2.2" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "version": "==1.15.1" + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.16.0" }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:051afcbd6d2ac39298d62d340f94dbb6a1f31de06dfaf6fcef7b759dd3860c45", - "sha256:0a1890fca2962c4f1ad16551d660b46ea77291fba2cc21c024cd527b9d9c8809", - "sha256:0ee30375b409d9a7ea0f30c50645d436b6f5dfee254edffd27e45a980ad2c7f4", - "sha256:13250b1f0bd023e0c9f11838bdeb60214dd5b6aaf8e8d2f110c7e232a1bff83b", - "sha256:17e01dd8666c445025c29684d4aabf5a90dc6ef1ab25328aa52bedaa95b65ad7", - "sha256:19245c249aa711d954623d94f23cc94c0fd65865661f20b7781210cb97c471c0", - "sha256:1caed2367b32cc80a2b7f58a9f46658218a19c6cfe5bc234021966dc3daa01f0", - "sha256:1f66862d3a41674ebd8d1a7b6f5387fe5ce353f8719040a986551a545d7d83ea", - "sha256:220e3fa77d14c8a507b2d951e463b57a1f7810a6443a26f9b7591ef39047b1b2", - "sha256:276f4cd0001cd83b00817c8db76730938b1ee40f4993b6a905f40a7278103b3a", - "sha256:29de916ba1099ba2aab76aca101580006adfac5646de9b7c010a0f13867cba45", - "sha256:2a7f23bbaeb2a87f90f607730b45564076d870f1fb07b9318d0c21f36871932b", - "sha256:2c407b1950b2d2ffa091f4e225ca19a66a9bd81222f27c56bd12658fc5ca1209", - "sha256:30b5fec1d34cc932c1bc04017b538ce16bf84e239378b8f75220478645d11fca", - "sha256:3c2155943896ac78b9b0fd910fb381186d0c345911f5333ee46ac44c8f0e43ab", - "sha256:411d4ff9d041be08fdfc02adf62e89c735b9468f6d8f6427f8a14b6bb0a85095", - "sha256:436e103950d05b7d7f55e39beeb4d5be298ca3e119e0589c0227e6d0b01ee8c7", - "sha256:49640bda9bda35b057b0e65b7c43ba706fa2335c9a9896652aebe0fa399e80e6", - "sha256:4a950f83fd3f9bca23b77442f3a2b2ea4ac900944d8af9993743774c4fdc57af", - "sha256:50a6adc2be8edd7ee67d1abc3cd20678987c7b9d79cd265de55941e3d0d56499", - "sha256:52ab14b9e09ce052237dfe12d6892dd39b0401690856bcfe75d5baba4bfe2831", - "sha256:54f7e9705e14b2c9f6abdeb127c390f679f6dbe64ba732788d3015f7f76ef637", - "sha256:66e50680e888840c0995f2ad766e726ce71ca682e3c5f4eee82272c7671d38a2", - "sha256:790e4433962c9f454e213b21b0fd4b42310ade9c077e8edcb5113db0818450cb", - "sha256:7a38362528a9115a4e276e65eeabf67dcfaf57698e17ae388599568a78dcb029", - "sha256:7b05ed4b35bf6ee790832f68932baf1f00caa32283d66cc4d455c9e9d115aafc", - "sha256:7e109f1c9a3ece676597831874126555997c48f62bddbcace6ed17be3e372de8", - "sha256:949844af60ee96a376aac1ded2a27e134b8c8d35cc006a52903fc06c24a3296f", - "sha256:95304068686545aa368b35dfda1cdfbbdbe2f6fe43de4a2e9baa8ebd71be46e2", - "sha256:9e662e6fc4f513b79da5d10a23edd2b87685815b337b1a30cd11307a6679148d", - "sha256:a9fed35ca8c6e946e877893bbac022e8563b94404a605af1d1e6accc7eb73289", - "sha256:b69522b168a6b64edf0c33ba53eac491c0a8f5cc94fa4337f9c6f4c8f2f5296c", - "sha256:b78729038abea6a5df0d2708dce21e82073463b2d79d10884d7d591e0f385ded", - "sha256:b8c56bec53d6e3154eaff6ea941226e7bd7cc0d99f9b3756c2520fc7a94e6d96", - "sha256:b9727ac4f5cf2cbf87880a63870b5b9730a8ae3a4a360241a0fdaa2f71240ff0", - "sha256:ba3027deb7abf02859aca49c865ece538aee56dcb4871b4cced23ba4d5088904", - "sha256:be9fcf32c010da0ba40bf4ee01889d6c737658f4ddff160bd7eb9cac8f094b21", - "sha256:c18d47f314b950dbf24a41787ced1474e01ca816011925976d90a88b27c22b89", - "sha256:c76a3075e96b9c9ff00df8b5f7f560f5634dffd1658bafb79eb2682867e94f78", - "sha256:cbfcba14a3225b055a28b3199c3d81cd0ab37d2353ffd7f6fd64844cebab31ad", - "sha256:d254666d29540a72d17cc0175746cfb03d5123db33e67d1020e42dae611dc196", - "sha256:d66187792bfe56f8c18ba986a0e4ae44856b1c645336bd2c776e3386da91e1dd", - "sha256:d8d04e755934195bdc1db45ba9e040b8d20d046d04d6d77e71b3b34a8cc002d0", - "sha256:d8f3e2e0a1d6777e58e834fd5a04657f66affa615dae61dd67c35d1568c38882", - "sha256:e057e74e53db78122a3979f908973e171909a58ac20df05c33998d52e6d35757", - "sha256:e4ce984133b888cc3a46867c8b4372c7dee9cee300335e2925e197bcd45b9e16", - "sha256:ea76dbcad0b7b0deb265d8c36e0801abcddf6cc1395940a24e3595288b405ca0", - "sha256:ecb0f73954892f98611e183f50acdc9e21a4653f294dfbe079da73c6378a6f47", - "sha256:ef14d75d86f104f03dea66c13188487151760ef25dd6b2dbd541885185f05f40", - "sha256:f26648e1b3b03b6022b48a9b910d0ae209e2d51f50441db5dce5b530fad6d9b1", - "sha256:f67472c09a0c7486e27f3275f617c964d25e35727af952869dd496b9b5b7f6a3" + "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa", + "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003", + "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f", + "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c", + "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e", + "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0", + "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9", + "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52", + "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", + "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", + "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0", + "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079", + "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352", + "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", + "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", + "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", + "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", + "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765", + "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc", + "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", + "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501", + "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7", + "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", + "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f", + "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", + "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", + "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", + "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51", + "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840", + "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", + "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", + "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e", + "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45", + "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba", + "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d", + "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", + "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", + "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", + "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", + "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9", + "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a", + "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", + "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1", + "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3", + "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914", + "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", + "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", + "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d", + "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0", + "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94", + "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc", + "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2" ], - "markers": "python_version >= '3.7'", - "version": "==7.0.5" + "markers": "python_version >= '3.8'", + "version": "==7.4.3" }, "cryptography": { "hashes": [ - "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b", - "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f", - "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190", - "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f", - "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f", - "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb", - "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c", - "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773", - "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72", - "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8", - "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717", - "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9", - "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856", - "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96", - "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288", - "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39", - "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e", - "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce", - "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1", - "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de", - "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df", - "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf", - "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], - "markers": "python_version >= '3.6'", - "version": "==39.0.0" + "markers": "python_version >= '3.7'", + "version": "==42.0.5" }, "exceptiongroup": { "hashes": [ - "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e", - "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.0" + "version": "==1.2.0" }, "flake8": { "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.0.0" + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "iniconfig": { "hashes": [ @@ -678,11 +782,11 @@ }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], "markers": "python_version >= '3.7'", - "version": "==3.1.2" + "version": "==3.1.3" }, "jmespath": { "hashes": [ @@ -694,59 +798,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed", - "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", - "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2", - "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460", - "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7", - "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", - "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", - "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa", - "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03", - "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", - "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65", - "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", - "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", - "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f", - "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4", - "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419", - "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2", - "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619", - "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", - "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a", - "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", - "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", - "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666", - "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", - "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859", - "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", - "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", - "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", - "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd", - "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba", - "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f", - "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", - "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094", - "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a", - "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513", - "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed", - "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", - "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3", - "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147", - "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c", - "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", - "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", - "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a", - "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", - "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", - "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", - "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54", - "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2", - "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", - "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" ], "markers": "python_version >= '3.7'", - "version": "==2.1.2" + "version": "==2.1.5" }, "mccabe": { "hashes": [ @@ -758,43 +872,36 @@ }, "moto": { "hashes": [ - "sha256:12f231196ebf22d19774f2a75738fdedae10a8c82abb8fa0877e1819aa799f4f", - "sha256:e65a692df57abb631b06c8f3f7827c9deceae3416887527e266c775ad722a2fa" + "sha256:070ac2edf89ad7aee28534481ce68e2f344c8a6a8fefec5427eea0d599bfdbdb", + "sha256:261d312d1d69c2afccb450a0566666d7b75d76ed6a7d00aac278a9633b073ff0" ], "index": "pypi", - "version": "==4.1.0" + "markers": "python_version >= '3.8'", + "version": "==5.0.3" }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==24.0" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" - }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" + "markers": "python_version >= '3.8'", + "version": "==1.4.0" }, "pycodestyle": { "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.1" }, "pycparser": { "hashes": [ @@ -805,75 +912,135 @@ }, "pyflakes": { "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_version >= '3.8'", + "version": "==3.2.0" }, "pytest": { "hashes": [ - "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5", - "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42" + "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7", + "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044" ], "index": "pypi", - "version": "==7.2.1" + "markers": "python_version >= '3.8'", + "version": "==8.1.1" }, "pytest-cov": { "hashes": [ - "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", - "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", - "version": "==4.0.0" + "markers": "python_version >= '3.7'", + "version": "==4.1.0" }, "pytest-html": { "hashes": [ - "sha256:868c08564a68d8b2c26866f1e33178419bb35b1e127c33784a28622eb827f3f3", - "sha256:c4e2f4bb0bffc437f51ad2174a8a3e71df81bbc2f6894604e604af18fbe687c3" + "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07", + "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71" ], "index": "pypi", - "version": "==3.2.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.1" }, "pytest-metadata": { "hashes": [ - "sha256:acb739f89fabb3d798c099e9e0c035003062367a441910aaaf2281bc1972ee14", - "sha256:fcc653f65fe3035b478820b5284fbf0f52803622ee3f60a2faed7a7d3ba1f41e" + "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b", + "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.0.4" + "markers": "python_version >= '3.8'", + "version": "==3.1.1" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" + }, + "pyyaml": { + "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0.1" }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.28.2" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" }, "responses": { "hashes": [ - "sha256:396acb2a13d25297789a5866b4881cf4e46ffd49cc26c43ab1117f40b973102e", - "sha256:dcf294d204d14c436fddcc74caefdbc5764795a40ff4e6a7740ed8ddbf3294be" + "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66", + "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a" ], - "markers": "python_version >= '3.7'", - "version": "==0.22.0" + "markers": "python_version >= '3.8'", + "version": "==0.25.0" }, "s3transfer": { "hashes": [ - "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd", - "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.6.0" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "six": { "hashes": [ @@ -883,14 +1050,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", @@ -899,28 +1058,21 @@ "markers": "python_version < '3.11'", "version": "==2.0.1" }, - "types-toml": { - "hashes": [ - "sha256:171bdb3163d79a520560f24ba916a9fc9bff81659c5448a9fea89240923722be", - "sha256:b7b5c4977f96ab7b5ac06d8a6590d17c0bf252a96efc03b109c2711fb3e0eafd" - ], - "version": "==0.10.8.1" - }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version < '3.10'", + "version": "==1.26.18" }, "werkzeug": { "hashes": [ - "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f", - "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5" + "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc", + "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10" ], - "markers": "python_version >= '3.7'", - "version": "==2.2.2" + "markers": "python_version >= '3.8'", + "version": "==3.0.1" }, "xmltodict": { "hashes": [ diff --git a/ecs/crm-datafetch/README.md b/ecs/crm-datafetch/README.md index fce4a50b..a501438b 100644 --- a/ecs/crm-datafetch/README.md +++ b/ecs/crm-datafetch/README.md @@ -4,7 +4,7 @@ ### ツールのバージョン -- Python 3.8.x +- Python 3.9.x - PipEnv(Pythonの依存関係管理用モジュール) ### 開発環境 diff --git a/ecs/crm-datafetch/src/converter/converter.py b/ecs/crm-datafetch/src/converter/converter.py index 09dbf00e..ce20bb4a 100644 --- a/ecs/crm-datafetch/src/converter/converter.py +++ b/ecs/crm-datafetch/src/converter/converter.py @@ -1,3 +1,4 @@ +from collections import OrderedDict from src.config.objects import TargetObject from src.converter.convert_strategy import ConvertStrategyFactory @@ -25,10 +26,11 @@ class CSVStringConverter: json_object = self.__extract_necessary_props_from(json_object) csv_row = [] for column in columns: - v = json_object[column.upper()] + column_name = column.upper() + column_value = self.__get_column_value(json_object, column_name) - convert_strategy = self.__convert_strategy_factory.create(v) - converted_value = convert_strategy.convert_value(v) + convert_strategy = self.__convert_strategy_factory.create(column_value) + converted_value = convert_strategy.convert_value(column_value) csv_row.append(converted_value) @@ -38,3 +40,31 @@ class CSVStringConverter: except Exception as e: raise Exception( f'CSV変換に失敗しました カラム名:[{column}] 行番号: [{i}] エラー内容:[{e}]') + + def __get_column_value(self, json_object: dict, column_name: str) -> str: + # 参照を辿らない通常の項目の場合、カラム名が一致するためそのまま取得 + if '.' not in column_name: + return json_object[column_name] + + # カラム名に`.`が含まれている場合、オブジェクトの参照を辿って終端を取得する + relationship_columns = column_name.split('.') + return self.__get_column_value_by_relationship(json_object, relationship_columns) + + def __get_column_value_by_relationship(self, json_object: dict, relationship_columns: str, recurs: int = 0) -> str: + # 参照関係の終端を取得しきるまで再帰的に深掘りする + # REVIEW: 参照の終端の項目型が住所型の場合、レスポンスが辞書型になるため大抵の場合Noneになる + relationship_name = relationship_columns[recurs] + relationship_item = json_object.get(relationship_name) + + # 項目が取得できなかったらNoneを返す + if relationship_item is None: + return None + + # 参照が辿りきれていない場合、再帰的に深掘りする + if type(relationship_item) == dict or type(relationship_item) == OrderedDict: + # 取り回しを良くするために、辞書のキーをアッパーケースにしておく + relationship_item_upper = {k.upper(): v for k, v in relationship_item.items()} + return self.__get_column_value_by_relationship(relationship_item_upper, relationship_columns, recurs + 1) + + # 終端のデータを取得 + return relationship_item diff --git a/ecs/crm-datafetch/tests/converter/test_converter.py b/ecs/crm-datafetch/tests/converter/test_converter.py index 0a301f44..992be814 100644 --- a/ecs/crm-datafetch/tests/converter/test_converter.py +++ b/ecs/crm-datafetch/tests/converter/test_converter.py @@ -11,7 +11,8 @@ class TestCSVStringConverter: def test_convert(self) -> str: """ Cases: - 入力データがCSV形式の文字列で出力されること + - 入力データがCSV形式の文字列で出力されること + - 参照関係を辿った項目の終端が取得されていること Arranges: - オブジェクト情報の作成 - データの作成 @@ -35,7 +36,10 @@ class TestCSVStringConverter: "RowCause", "LastModifiedDate", "LastModifiedById", - "IsDeleted" + "IsDeleted", + "Account.Name", + "Account.attributes.type", + "Account.attributes.url" ], "is_skip": False, "is_update_last_fetch_datetime": False, @@ -57,7 +61,8 @@ class TestCSVStringConverter: ('RowCause', 'テストのため1'), ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), - ('IsDeleted', False) + ('IsDeleted', False), + ('Account', None) ]), OrderedDict([ ('attributes', OrderedDict([('type', 'AccountShare'), ('url', '/services/data/v1.0/sobjects/AccountShare/test1')])), @@ -71,7 +76,8 @@ class TestCSVStringConverter: ('RowCause', 'テストのため2'), ('LastModifiedDate', '2022-06-02T16:30:30.000+0000'), ('LastModifiedById', 2.23E+0), - ('IsDeleted', True) + ('IsDeleted', True), + ('Account', None) ]), OrderedDict([ ('attributes', OrderedDict([('type', 'AccountShare'), ('url', '/services/data/v1.0/sobjects/AccountShare/test1')])), @@ -85,7 +91,26 @@ class TestCSVStringConverter: ('RowCause', 'テストのため3'), ('LastModifiedDate', '2022-06-03T23:50:50.000+0000'), ('LastModifiedById', 3.234567), - ('IsDeleted', False) + ('IsDeleted', True), + ('Account', None) + ]), + OrderedDict([ + ('attributes', OrderedDict([('type', 'AccountShare'), ('url', '/services/data/v1.0/sobjects/AccountShare/test1')])), + ('Id', 'TEST004'), + ('AccountId', 'test004'), + ('UserOrGroupId', None), + ('AccountAccessLevel', 13), + ('OpportunityAccessLevel', 14), + ('CaseAccessLevel', 15), + ('ContactAccessLevel', 16), + ('RowCause', 'テストのため4'), + ('LastModifiedDate', '2022-06-03T23:50:50.000+0000'), + ('LastModifiedById', 3.234567), + ('IsDeleted', False), + ('Account', OrderedDict([ + ('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v1.0/sobjects/Account/test4')])), + ('Name', 'テスト取引先'), + ])) ]) ] @@ -99,10 +124,13 @@ class TestCSVStringConverter: # Expects expect = [ ["Id", "AccountId", "UserOrGroupId", "AccountAccessLevel", "OpportunityAccessLevel", "CaseAccessLevel", - "ContactAccessLevel", "RowCause", "LastModifiedDate", "LastModifiedById", "IsDeleted"], - ["TEST001", "test001", "", 1, 2, 3, 4, "テストのため1", "2022-06-01 09:00:00", 1234567.0, 0], - ["TEST002", "test002", "", 5, 6, 7, 8, "テストのため2", "2022-06-03 01:30:30", 2.23, 1], - ["TEST003", "test003", "", 9, 10, 11, 12, "テストのため3", "2022-06-04 08:50:50", 3.234567, 0] + "ContactAccessLevel", "RowCause", "LastModifiedDate", "LastModifiedById", "IsDeleted", + "Account.Name", "Account.attributes.type", "Account.attributes.url"], + ["TEST001", "test001", "", 1, 2, 3, 4, "テストのため1", "2022-06-01 09:00:00", 1234567.0, 0, "", "", ""], + ["TEST002", "test002", "", 5, 6, 7, 8, "テストのため2", "2022-06-03 01:30:30", 2.23, 1, "", "", ""], + ["TEST003", "test003", "", 9, 10, 11, 12, "テストのため3", "2022-06-04 08:50:50", 3.234567, 1, "", "", ""], + ["TEST004", "test004", "", 13, 14, 15, 16, "テストのため4", "2022-06-04 08:50:50", + 3.234567, 0, "テスト取引先", "Account", "/services/data/v1.0/sobjects/Account/test4"] ] assert actual == expect @@ -184,7 +212,12 @@ class TestCSVStringConverter: ('RowCause', 'テストのため3'), ('LastModifiedDate', '2022-06-03T23:50:50.000+0000'), ('LastModifiedById', 3.234567E+6), - ('IsDeleted', False) + ('IsDeleted', False), + ('Account', OrderedDict([ + ('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v1.0/sobjects/Account/test3')])), + ('Name', 'テスト取引先'), + ]) + ), ]) ] diff --git a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py index 64530071..533a7a50 100644 --- a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py +++ b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py @@ -286,6 +286,56 @@ class TestSalesforceApiClient: actual = sut.fetch_sf_data(soql) assert len(actual) >= 0 + def test_fetch_sf_data_relationship_object_depth_1(self): + """ + Cases: + 参照関係を1回辿るSOQLを実行し、Salesforceからデータが取得できること + Arranges: + Salesforceの以下のオブジェクトに、レコードを作成する(手作業、コード上では行わない) + - RelationShipTest__c + Expects: + 取得結果が期待値と一致すること + """ + soql = """SELECT + Id, + Name, + RecordTypeId, + RecordType.DeveloperName + FROM + RelationShipTest__c + ORDER BY Name ASC + """ + sut = SalesforceApiClient() + + actual = sut.fetch_sf_data(soql) + assert len(actual) > 0 + assert dict(actual[0])["RecordType"]["DeveloperName"] == "RecordTypeNormal" + + def test_fetch_sf_data_relationship_object_depth_2(self): + """ + Cases: + 参照関係を2回辿るSOQLを実行し、Salesforceからデータが取得できること + Arranges: + Salesforceの以下のオブジェクトに、レコードを作成する(手作業、コード上では行わない) + - RelationShipTest__c + - RelationShipTest_Child__c + Expects: + 取得結果が期待値と一致すること + """ + soql = """SELECT + Id, + Name, + RelationShipTest__r.RecordType.DeveloperName + FROM + RelationShipTest_Child__c + ORDER BY Name ASC + """ + sut = SalesforceApiClient() + + actual = sut.fetch_sf_data(soql) + assert len(actual) > 0 + assert dict(actual[0])["RelationshipTest__r"]["RecordType"]["DeveloperName"] == "RecordTypeNormal" + def test_fetch_sf_data_by_soql_builder_system_modstamp_to_ge(self): """ Cases: @@ -532,6 +582,78 @@ class TestSalesforceApiClient: assert len(actual) == 17 # 内容の確認は別のケースで行っているため省略 + def test_fetch_sf_data_by_soql_builder_relationship_object_depth_1(self): + """ + Cases: + - SOQLBuilderから生成したSOQLで、Salesforceから参照関係を1回辿ったオブジェクト項目が取得できること + Arranges: + - Salesforceの以下のオブジェクトに、レコードを作成する(手作業、コード上では行わない) + - RelationShipTest__c + - RelationShipTest_Child__c + - LastFetchDatetimeのFromに2000年1月1日を指定する + - LastFetchDatetimeのToに2100年12月31日を指定する + Expects: + 取得できたオブジェクトの1件をサンプリング確認し、レコードタイプ名(DeveloperName)が含まれている + """ + + execute_datetime = ExecuteDateTime() + last_fetch_datetime = LastFetchDatetime({ + 'last_fetch_datetime_from': '2000-01-01T00:00:00.000Z', + 'last_fetch_datetime_to': '2100-12-31T23:59:59.000Z', + }, execute_datetime) + target_object = TargetObject({ + 'object_name': 'RelationShipTest__c', + 'columns': [ + 'Id', + 'Name', + 'RecordTypeId', + 'RecordType.DeveloperName' + ] + }, execute_datetime) + soql_builder = SOQLBuilder(target_object, last_fetch_datetime) + soql = soql_builder.create_fetch_soql() + sut = SalesforceApiClient() + + actual = sut.fetch_sf_data(soql) + assert len(actual) > 0 + assert dict(actual[0])["RecordType"]["DeveloperName"] == "RecordTypeNormal" + ... + + def test_fetch_sf_data_by_soql_builder_relationship_object_depth_2(self): + """ + Cases: + - SOQLBuilderから生成したSOQLで、Salesforceから参照関係を2回辿ったオブジェクト項目が取得できること + Arranges: + - Salesforceの以下のオブジェクトに、レコードを作成する(手作業、コード上では行わない) + - RelationShipTest__c + - RelationShipTest_Child__c + - LastFetchDatetimeのFromに2000年1月1日を指定する + - LastFetchDatetimeのToに2100年12月31日を指定する + Expects: + 取得できたオブジェクトの1件をサンプリング確認し、レコードタイプ名(DeveloperName)が含まれている + """ + + execute_datetime = ExecuteDateTime() + last_fetch_datetime = LastFetchDatetime({ + 'last_fetch_datetime_from': '2000-01-01T00:00:00.000Z', + 'last_fetch_datetime_to': '2100-12-31T23:59:59.000Z', + }, execute_datetime) + target_object = TargetObject({ + 'object_name': 'RelationShipTest_Child__c', + 'columns': [ + 'Id', + 'Name', + 'RelationShipTest__r.RecordType.DeveloperName' + ] + }, execute_datetime) + soql_builder = SOQLBuilder(target_object, last_fetch_datetime) + soql = soql_builder.create_fetch_soql() + sut = SalesforceApiClient() + + actual = sut.fetch_sf_data(soql) + assert len(actual) > 0 + assert dict(actual[0])["RelationshipTest__r"]["RecordType"]["DeveloperName"] == "RecordTypeSpecial" + def test_raise_create_instance_cause_auth_failed(self, monkeypatch): """ Cases: diff --git a/ecs/crm-datafetch/tests/test_walk_through.py b/ecs/crm-datafetch/tests/test_walk_through.py index e2be6670..75bf894d 100644 --- a/ecs/crm-datafetch/tests/test_walk_through.py +++ b/ecs/crm-datafetch/tests/test_walk_through.py @@ -6,6 +6,7 @@ from datetime import datetime, timezone import boto3 import pytest + from src.controller import controller from src.parser.json_parser import JsonParser from src.system_var.constants import YYYYMMDDTHHMMSSTZ @@ -114,6 +115,10 @@ def test_walk_through(s3_test, s3_client, monkeypatch, caplog): logger.info(f'##########################') # Assertion log_messages = caplog.messages + # ログの目視確認を容易にするため、ローカルファイルに書き出す。 + with open('crm_datafetch_test_walk_through_diff.log', 'w', encoding='utf8') as f: + f.write('\n'.join(log_messages)) + # ループ前のログ確認 assert 'I-CTRL-01 CRMデータ取得処理を開始します' in log_messages assert 'I-CTRL-02 データ取得準備処理呼び出し' in log_messages @@ -170,6 +175,10 @@ def test_walk_through(s3_test, s3_client, monkeypatch, caplog): logger.info(f'##########################') # ログ再取得 log_messages_all = caplog.messages + # ログの目視確認を容易にするため、ローカルファイルに書き出す。 + with open('crm_datafetch_test_walk_through_all.log', 'w', encoding='utf8') as f: + f.write('\n'.join(log_messages_all)) + object_info_list_all = object_info_files[1] # 開始ログなどはテスト済みなのでチェックを省く for object_info in object_info_list_all['objects']: diff --git a/ecs/export-dbdump/.dockerignore b/ecs/export-dbdump/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/export-dbdump/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/export-dbdump/.env.example b/ecs/export-dbdump/.env.example new file mode 100644 index 00000000..9782a3ce --- /dev/null +++ b/ecs/export-dbdump/.env.example @@ -0,0 +1,9 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=***** + +DUMP_BACKUP_BUCKET=************ + +LOG_LEVEL=INFO diff --git a/ecs/export-dbdump/.gitignore b/ecs/export-dbdump/.gitignore new file mode 100644 index 00000000..cf44449e --- /dev/null +++ b/ecs/export-dbdump/.gitignore @@ -0,0 +1,11 @@ +.vscode/settings.json +.env +my.cnf + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/export-dbdump/.vscode/launch.json b/ecs/export-dbdump/.vscode/launch.json new file mode 100644 index 00000000..2121f066 --- /dev/null +++ b/ecs/export-dbdump/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG) export dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/export-dbdump/.vscode/recommended_settings.json b/ecs/export-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/export-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/export-dbdump/Dockerfile b/ecs/export-dbdump/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/export-dbdump/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/export-dbdump/Pipfile b/ecs/export-dbdump/Pipfile new file mode 100644 index 00000000..f032c7ea --- /dev/null +++ b/ecs/export-dbdump/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/export-dbdump/Pipfile.lock b/ecs/export-dbdump/Pipfile.lock new file mode 100644 index 00000000..58c4d231 --- /dev/null +++ b/ecs/export-dbdump/Pipfile.lock @@ -0,0 +1,71 @@ +{ + "_meta": { + "hash": { + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/export-dbdump/README.md b/ecs/export-dbdump/README.md new file mode 100644 index 00000000..a3764e33 --- /dev/null +++ b/ecs/export-dbdump/README.md @@ -0,0 +1,48 @@ +# 【共通】DBダンプ取得  + +## 概要 + +当処理は特定の機能で利用するものではなく、共通処理として要件に応じて実行することを想定している。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_dbdump.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/export-dbdump/entrypoint.py b/ecs/export-dbdump/entrypoint.py new file mode 100644 index 00000000..221f3770 --- /dev/null +++ b/ecs/export-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""【共通】DBダンプ取得処理のエントリーポイント""" +from src import jobctrl_dbdump + +if __name__ == '__main__': + try: + exit(jobctrl_dbdump.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/export-dbdump/mysql_dpkg_selection.txt b/ecs/export-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/export-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/export-dbdump/src/__init__.py b/ecs/export-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/jobctrl_dbdump.py b/ecs/export-dbdump/src/jobctrl_dbdump.py new file mode 100644 index 00000000..a82c155f --- /dev/null +++ b/ecs/export-dbdump/src/jobctrl_dbdump.py @@ -0,0 +1,106 @@ +"""DBダンプ取得""" + +import datetime +import os +import subprocess +import textwrap + +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('DBダンプ取得') + + +def exec(): + try: + logger.info('DBダンプ取得:開始') + + # 事前処理(共通処理としては空振りする) + _pre_exec() + + # メイン処理 + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + # ファイルのパーミッションが強いとmysqldumpコマンドが実行できないため + # my.cnfファイルのパーミッションをread-onlyに設定 + os.chmod(my_cnf_path, 0o444) + + dt_now = datetime.datetime.now() + converted_value = dt_now.strftime('%Y%m%d%H%M%S%f') + dump_file_name = f'backup_rds_{environment.DB_SCHEMA}_{converted_value}.gz' + s3_file_path = f's3://{environment.DUMP_BACKUP_BUCKET}/{constants.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' + + # mysqldumpコマンドを実行し、dumpを取得する + command = [ + 'mysqldump', + f'--defaults-file={my_cnf_path}', + '-P', + f"{environment.DB_PORT}", + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', + environment.DB_SCHEMA + ] + + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gzipコマンドを実行してdump結果を圧縮する + gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # aws s3 cpコマンドを実行してアップロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする + mysqldump_process.stdout.close() + # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = mysqldump_process.communicate() + if mysqldump_process.returncode != 0: + raise Exception(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = gzip_process.communicate() + if gzip_process.returncode != 0: + raise Exception(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + raise Exception(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + # 事後処理(共通処理としては空振りする) + _post_exec() + + logger.info('DBダンプ取得:終了(正常終了)') + logger.info(f'出力ファイルパス: {s3_file_path}') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'DBダンプ取得中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + +def _pre_exec(): + """ + ダンプ復元 事前処理 + 共通機能としては事前処理を実装しない。 + 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass + +def _post_exec(): + """ + ダンプ復元 事後処理 + 共通機能としては事後処理を実装しない。 + 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass \ No newline at end of file diff --git a/ecs/export-dbdump/src/logging/get_logger.py b/ecs/export-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/export-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/export-dbdump/src/system_var/__init__.py b/ecs/export-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/system_var/constants.py b/ecs/export-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..4d288bbd --- /dev/null +++ b/ecs/export-dbdump/src/system_var/constants.py @@ -0,0 +1,5 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# ダンプバックアップフォルダー +DUMP_BACKUP_FOLDER = 'dump' \ No newline at end of file diff --git a/ecs/export-dbdump/src/system_var/environment.py b/ecs/export-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..61fdd693 --- /dev/null +++ b/ecs/export-dbdump/src/system_var/environment.py @@ -0,0 +1,19 @@ +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'] + +# AWS +DUMP_BACKUP_BUCKET = os.environ['DUMP_BACKUP_BUCKET'] + +# 初期値がある環境変数 +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)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + diff --git a/ecs/jskult-batch-daily/.dockerignore b/ecs/jskult-batch-daily/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-batch-daily/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example new file mode 100644 index 00000000..500f843d --- /dev/null +++ b/ecs/jskult-batch-daily/.env.example @@ -0,0 +1,26 @@ +DB_HOST=************ +DB_PORT=************ +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 +LOG_LEVEL=INFO +ULTMARC_DATA_BUCKET=**************** +ULTMARC_DATA_FOLDER=recv +JSKULT_BACKUP_BUCKET=**************** +ULTMARC_BACKUP_FOLDER=ultmarc +VJSK_BACKUP_FOLDER=vjsk +JSKULT_CONFIG_BUCKET=********************** +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +VJSK_DATA_SEND_FOLDER=send +VJSK_DATA_RECEIVE_FOLDER=recv +VJSK_DATA_BUCKET=************* +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt +JSKULT_CONFIG_CONVERT_FOLDER=jskult/convert +JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME=ultmarc_hex_convert_config.json +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau +# 卸実績洗替で作成するデータの期間(年単位) +SALES_LAUNDERING_TARGET_YEAR_OFFSET=5 diff --git a/ecs/jskult-batch-daily/.gitignore b/ecs/jskult-batch-daily/.gitignore new file mode 100644 index 00000000..bd0b37f8 --- /dev/null +++ b/ecs/jskult-batch-daily/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/.vscode/launch.json b/ecs/jskult-batch-daily/.vscode/launch.json new file mode 100644 index 00000000..9dbaa9c6 --- /dev/null +++ b/ecs/jskult-batch-daily/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG)jskult batch daily", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json new file mode 100644 index 00000000..2fde8732 --- /dev/null +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-batch-daily/Dockerfile b/ecs/jskult-batch-daily/Dockerfile new file mode 100644 index 00000000..dd891d48 --- /dev/null +++ b/ecs/jskult-batch-daily/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile new file mode 100644 index 00000000..a40e6c17 --- /dev/null +++ b/ecs/jskult-batch-daily/Pipfile @@ -0,0 +1,29 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[scripts] +"test:ultmarc" = "pytest tests/batch/ultmarc/" +"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" +"test:vjsk" = "pytest tests/batch/vjsk/" +"test:vjsk:cov" = "pytest --cov=src/batch/vjsk/ --cov-branch --cov-report=term-missing tests/batch/vjsk/" + +[packages] +boto3 = "*" +PyMySQL = "*" +sqlalchemy = "*" +tenacity = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" +pytest = "*" +pytest-cov = "*" +boto3 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock new file mode 100644 index 00000000..ee64e81a --- /dev/null +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -0,0 +1,442 @@ +{ + "_meta": { + "hash": { + "sha256": "df8b09869c6ad0daff24cf808bac56f528d8ae5835fe70a50d58c2bed724e717" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "boto3": { + "hashes": [ + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "botocore": { + "hashes": [ + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" + ], + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "greenlet": { + "hashes": [ + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.3" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "markers": "python_version >= '3.7'", + "version": "==1.1.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "s3transfer": { + "hashes": [ + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.0.28" + }, + "tenacity": { + "hashes": [ + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==8.2.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" + ], + "markers": "python_version >= '3.8'", + "version": "==4.10.0" + }, + "urllib3": { + "hashes": [ + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + ], + "markers": "python_version < '3.10'", + "version": "==1.26.18" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "boto3": { + "hashes": [ + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "botocore": { + "hashes": [ + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" + ], + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "coverage": { + "extras": [ + "toml" + ], + "hashes": [ + "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa", + "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003", + "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f", + "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c", + "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e", + "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0", + "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9", + "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52", + "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", + "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", + "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0", + "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079", + "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352", + "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", + "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", + "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", + "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", + "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765", + "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc", + "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", + "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501", + "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7", + "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", + "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f", + "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", + "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", + "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", + "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51", + "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840", + "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", + "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", + "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e", + "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45", + "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba", + "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d", + "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", + "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", + "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", + "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", + "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9", + "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a", + "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", + "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1", + "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3", + "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914", + "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", + "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", + "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d", + "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0", + "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94", + "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc", + "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2" + ], + "markers": "python_version >= '3.8'", + "version": "==7.4.3" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.0" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + ], + "markers": "python_version >= '3.7'", + "version": "==24.0" + }, + "pluggy": { + "hashes": [ + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "pytest": { + "hashes": [ + "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7", + "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.1.1" + }, + "pytest-cov": { + "hashes": [ + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==4.1.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "s3transfer": { + "hashes": [ + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "urllib3": { + "hashes": [ + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + ], + "markers": "python_version < '3.10'", + "version": "==1.26.18" + } + } +} diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md new file mode 100644 index 00000000..144cf9b8 --- /dev/null +++ b/ecs/jskult-batch-daily/README.md @@ -0,0 +1,292 @@ +# 実消化&アルトマーク 日次バッチ + +## 概要 + +実消化&アルトマークの日次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- 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 フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) | + +### テスト共通関数の仕様 + +- 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に指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする + + +## 単体テスト(実消化データ取込処理) + +実消化データは、単体テストコードを使用してテスト自動化を行う + +### テスト準備 + +※単体テスト(アルトマーク取込処理)と同じ + +### テスト用のサブコマンド一覧 + +- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる + - `Pipfile`内の「scripts」セクションに宣言されている + +| コマンド | 概要 | +| ---------------- | -------------------------------------------------------------------------------------------- | +| test:vjsk | tests/batch/vjsk フォルダ配下のユニットテストを実行する | +| test:vjsk:cov | tests/batch/vjsk フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) | + +### テスト共通関数の仕様 + +- tests/testing_vjsk_utility.py内の共通関数の仕様について記載する + +#### create_vjsk_assertion_list + +- 概要 + - DB登録期待値リストを作成する +- Args: + - file_path (str): DB登録期待値ファイル(tsvファイル)のパス + - memo: ※DB登録期待値ファイルの前提 + - memo: 受領データファイルと同じ + - memo: BOM付きtsv形式 + - memo: 一行目はカラム名になっているヘッダ行 + - Returns: + - List(dict) DB登録期待値辞書リスト + + +## フォルダ構成 + +```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 -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分) +│ │ │ │ ├── com_alma_mapper.py +│ │ │ │ ├── ... +│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス +│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス +│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分) +│ │ │ ├── com_alma.py +│ │ │ ├── ... +│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス +│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス +│ ├── db +│ │ └── database.py -- データベース操作共通処理 +│ ├── error +│ │ └── exceptions.py -- カスタム例外 +│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 +│ ├── logging +│ │ └── get_logger.py -- ログ出力の共通処理 +│ ├── system_var +│ │ └── environment.py -- 環境変数 +│ └── time +│ └── 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で用意する。 + │ │ ... + │ └─vjsk -- 実消化データ取込処理関連のユニットテストを格納する + │ │ + │ ├─vjsk_file_check -- 受領ファイルチェック処理関連のユニットテストを格納する + │ │ ├─conftest.py -- テスト内で共通利用できるフィクスチャの宣言 + │ │ └─test_vjsk_file_check.py -- テストクラス本体 + │ │ + │ └─vjsk_load -- 受領データ登録処理関連のユニットテストを格納する + │ │ conftest.py -- テスト内で共通利用できるフィクスチャの宣言 + │ │ test_vjsk_load.py -- テストクラス本体 + │ │ + │ └─testdata -- テストモジュールが使用するテストデータを格納する + │ │ bio_slip_data_202304280000.tsv -- 正常ケースの単体確認用 + │ │ ... -- *20230428* は新規4件の登録確認用 + │ │ whs_mst_202304290000.tsv -- *20230429* は更新2件+追加新規2件の登録確認用 + │ │ + │ ├─NoData -- 正常ケースの単体確認用 + │ │ bio_slip_data_nodatarecord.tsv -- ヘッダ行のみでデータが0件の動作確認用 + │ │ ... + │ │ whs_mst_nodatarecord.tsv + │ │ + │ ├─TestFormatErrorFile -- 異常ケースの単体確認用 + │ │ bio_slip_data_formaterror.tsv -- 末尾行のタブ数が想定と異なる(ファイル欠落がある)ときの動作確認用 + │ │ ... + │ │ whs_mst_formaterror.tsv + │ │ + │ ├─TestImportFileToDb -- 正常ケースの単体確認用 + │ │ bio_slip_data_202304270000.gz -- 対向元システムから送られてきた状態(gz圧縮)の受領データファイルの動作確認用 + │ │ ... + │ │ whs_mst_202304270000.gz + │ │ + │ └─UnzipError -- 異常ケースの単体確認用 + │ bio_slip_data_202304270000.gz -- gz圧縮ファイルが解凍できないときの動作確認用 + │ ... + │ whs_mst_202304270000.gz + │ + ├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ) + ├── testing_utility.py -- テストの共通関数 + └── testing_vjsk_utility.py -- テストの共通関数(実消化データ取込処理関連) +``` + diff --git a/ecs/jskult-batch-daily/entrypoint.py b/ecs/jskult-batch-daily/entrypoint.py new file mode 100644 index 00000000..472efd9f --- /dev/null +++ b/ecs/jskult-batch-daily/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチのエントリーポイント""" +from src import jobctrl_daily + +if __name__ == '__main__': + try: + exit(jobctrl_daily.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-batch-daily/pytest.ini b/ecs/jskult-batch-daily/pytest.ini new file mode 100644 index 00000000..5dbe2661 --- /dev/null +++ b/ecs/jskult-batch-daily/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +log_format = %(levelname)s %(asctime)s %(message)s +log_date_format = %Y-%m-%d %H:%M:%S diff --git a/ecs/jskult-batch-daily/src/__init__.py b/ecs/jskult-batch-daily/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/aws/__init__.py b/ecs/jskult-batch-daily/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py new file mode 100644 index 00000000..6203868d --- /dev/null +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -0,0 +1,185 @@ +import gzip +import os +import os.path as path +import shutil +import tempfile + +import boto3 + +from src.system_var import environment + + +class S3Client: + __s3_client = boto3.client('s3') + _bucket_name: str + + def list_objects(self, bucket_name: str, folder_name: str): + response = self.__s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_name) + if response['KeyCount'] == 0: + return [] + contents = response['Contents'] + # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする + 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, + Key=file_key, + Fileobj=file + ) + 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 + ) + + 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 + + +class UltmarcBucket(S3Bucket): + _bucket_name = environment.ULTMARC_DATA_BUCKET + _folder = environment.ULTMARC_DATA_FOLDER + + def list_dat_file(self): + return self._s3_client.list_objects(self._bucket_name, self._folder) + + def download_dat_file(self, dat_filename: str): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + 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, dat_filename, f) + f.seek(0) + return temporary_file_path + + 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}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key) + # コピー元のファイルを削除 + self._s3_client.delete_file(self._bucket_name, dat_file_key) + + +class ConfigBucket(S3Bucket): + _bucket_name = environment.JSKULT_CONFIG_BUCKET + + def download_holiday_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME) + holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, holiday_list_key, f) + f.seek(0) + return temporary_file_path + + def download_wholesaler_stock_input_day_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME) + wholesaler_stock_input_day_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, wholesaler_stock_input_day_list_key, f) + f.seek(0) + return temporary_file_path + + def download_ultmarc_hex_convert_config(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME) + hex_convert_config_key = f'{environment.JSKULT_CONFIG_CONVERT_FOLDER}/{environment.JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, hex_convert_config_key, f) + f.seek(0) + return temporary_file_path + + +class JskUltBackupBucket(S3Bucket): + _bucket_name = environment.JSKULT_BACKUP_BUCKET + + +class UltmarcBackupBucket(JskUltBackupBucket): + _folder = environment.ULTMARC_BACKUP_FOLDER + + +class VjskBackupBucket(JskUltBackupBucket): + _folder = environment.VJSK_BACKUP_FOLDER + + +class VjskReceiveBucket(S3Bucket): + _bucket_name = environment.VJSK_DATA_BUCKET + _recv_folder = environment.VJSK_DATA_RECEIVE_FOLDER + + _s3_file_list = None + + def get_s3_file_list(self): + self._s3_file_list = self._s3_client.list_objects(self._bucket_name, self._recv_folder) + return self._s3_file_list + + def download_data_file(self, data_filename: str): + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._recv_folder}/", "")}') + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, data_filename, f) + f.seek(0) + return temporary_file_path + + def unzip_data_file(self, filename: str): + temp_dir = os.path.dirname(filename) + decompress_filename = os.path.basename(filename).replace('.gz', '') + decompress_file_path = os.path.join(temp_dir, decompress_filename) + with gzip.open(filename, 'rb') as gz: + with open(decompress_file_path, 'wb') as decompressed_file: + shutil.copyfileobj(gz, decompressed_file) + + ret = [decompress_file_path] + return ret + + def backup_dat_file(self, target_files: list, datetime_key: str): + jskult_backup_bucket = VjskBackupBucket() + for target_file in target_files: + backup_from_file_path = target_file.get("filename") + backup_to_filename = backup_from_file_path.replace(f"{self._recv_folder}/", "") + backup_key = f'{jskult_backup_bucket._folder}/{datetime_key}/{backup_to_filename}' + self._s3_client.copy(self._bucket_name, backup_from_file_path, + jskult_backup_bucket._bucket_name, backup_key) + self._s3_client.delete_file(self._bucket_name, backup_from_file_path) + + +class VjskSendBucket(S3Bucket): + _bucket_name = environment.VJSK_DATA_BUCKET + _send_folder = environment.VJSK_DATA_SEND_FOLDER + + def upload_inst_pharm_csv_file(self, vjsk_create_csv: str, csv_file_path: str): + # S3バケットにファイルを移動 + csv_file_name = f'{self._send_folder}/{vjsk_create_csv}' + s3_client = S3Client() + s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name) + return + + def backup_inst_pharm_csv_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + vjsk_backup_bucket = VjskBackupBucket() + dat_key = f'{self._send_folder}/{dat_file_key}' + backup_key = f'{vjsk_backup_bucket._folder}/{self._send_folder}/{datetime_key}/{dat_file_key.replace(f"{self._send_folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_key, vjsk_backup_bucket._bucket_name, backup_key) diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py new file mode 100644 index 00000000..43c4760c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -0,0 +1,111 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap +from datetime import datetime + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants + + +def get_batch_statuses() -> tuple[str, str, str]: + """日付テーブルから、以下を取得して返す。 + - 日次バッチ処理中フラグ + - dump取得状況区分 + - 処理日(YYYY/MM/DD) + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]日次バッチ処理中フラグ、dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + syor_date = hdke_tbl_record['syor_date'] + # 処理日を文字列に変換する + syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') + + return batch_processing_flag, dump_status_kbn, syor_date_str + + +def update_batch_processing_flag_in_processing() -> None: + """バッチ処理中フラグを処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + bch_actf = :in_processing, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_batch_process_complete() -> None: + """バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + bch_actf = :batch_complete, + dump_sts_kbn = :dump_unprocessed, + syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d'), -- +1日 + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, { + 'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED, + 'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/__init__.py b/ecs/jskult-batch-daily/src/batch/bio_sales/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py new file mode 100644 index 00000000..2463b0e2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py @@ -0,0 +1,398 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +batch_context = BatchContext.get_instance() +logger = get_logger('生物由来卸販売ロット分解') + + +def exec(): + """生物由来卸販売ロット分解""" + logger.debug('生物由来卸販売ロット分解処理開始') + + # 営業日ではない場合、処理をスキップする + if batch_context.is_not_business_day: + logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') + return + db = Database.get_instance() + try: + db.connect() + db.begin() + # 生物由来ロット分解データの未確定データを削除する + _delete_not_confirm_data_in_bio_sales_lot(db) + # 生物由来ロット分解データを作成する + _insert_bio_sales_lot(db) + # 生物由来ロット分解データの不要レコードを削除する + _delete_empty_lot_record(db) + # MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットする + _set_inst_info_from_mdb_or_mst_inst(db) + # V製品マスタから製品情報を生物由来ロット分解データにセットする + _set_prd_info_from_v_prd_mst(db) + # 製造ロット管理番号マスタから有効期限を生物由来ロット分解データにセットする + _set_expr_dt_from_lot_num_mst(db) + db.commit() + logger.debug('生物由来卸販売ロット分解処理終了') + return + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _delete_not_confirm_data_in_bio_sales_lot(db: Database): + logger.debug('生物由来ロット分解データの未確定データ削除開始') + try: + elapsed_time = ElapsedTime() + sql = """ + DELETE lot FROM src05.bio_sales_lot AS lot + INNER JOIN src05.bio_sales AS bio + ON bio.slip_mgt_num = lot.slip_mgt_num + AND DATE(bio.dwh_upd_dt) >= src05.get_syor_date() + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの未確定データ削除に失敗') + raise e + logger.debug('生物由来ロット分解データの未確定データ削除に成功') + + +def _insert_bio_sales_lot(db: Database): + logger.debug('生物由来ロット分解データの作成開始') + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO src05.bio_sales_lot + SELECT + bio.slip_mgt_num AS slip_mgt_num, + conv.conv_cd AS conv_cd, + bio.rec_whs_cd AS rec_whs_cd, + bio.rec_whs_sub_cd AS rec_whs_sub_cd, + bio.rec_whs_org_cd AS rec_whs_org_cd, + bio.rec_comm_cd AS rec_comm_cd, + bio.rec_tran_kbn AS rec_tran_kbn, + bio.rev_hsdnymd_srk AS rev_hsdnymd_srk, + bio.rec_urag_num AS rec_urag_num, + bio.rec_comm_name AS rec_comm_name, + bio.rec_nonyu_fcl_name AS rec_nonyu_fcl_name, + bio.rec_nonyu_fcl_addr AS rec_nonyu_fcl_addr, + -- 3レコードに分解する + CASE conv.conv_cd + WHEN 1 THEN bio.rec_lot_num1 + WHEN 2 THEN bio.rec_lot_num2 + WHEN 3 THEN bio.rec_lot_num3 + END AS rec_lot_num, + bio.rec_ymd AS rec_ymd, + bio.v_tran_cd AS v_tran_cd, + bio.tran_kbn_name AS tran_kbn_name, + bio.whs_org_cd AS whs_org_cd, + bio.v_whsorg_cd AS v_whsorg_cd, + bio.whs_org_name AS whs_org_name, + bio.v_whs_cd AS v_whs_cd, + bio.whs_name AS whs_name, + bio.nonyu_fcl_cd AS nonyu_fcl_cd, + bio.v_inst_cd AS v_inst_cd, + bio.v_inst_kn AS v_inst_kn, + bio.v_inst_name AS v_inst_name, + bio.v_inst_addr AS v_inst_addr, + bio.comm_cd AS comm_cd, + bio.product_name AS product_name, + bio.whs_rep_comm_name AS whs_rep_comm_name, + bio.whs_rep_nonyu_fcl_name AS whs_rep_nonyu_fcl_name, + bio.whs_rep_nonyu_fcl_addr AS whs_rep_nonyu_fcl_addr, + /* 製品名と製品コードは後ほどV製品マスタからセットする */ + -- 製品名 + NULL AS mkr_inf_1, + -- 製品コード + NULL AS mkr_cd, + -- 数量 + -- Veeva取引区分の先頭が「2」の場合、マイナス表示にする + CASE conv.conv_cd + WHEN 1 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty1 >= 1) THEN -bio.qty1 + ELSE bio.qty1 + END + WHEN 2 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty2 >= 1) THEN -bio.qty2 + ELSE bio.qty2 + END + WHEN 3 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty3 >= 1) THEN -bio.qty3 + ELSE bio.qty3 + END + END AS qty, + bio.slip_org_kbn AS slip_org_kbn, + bio.bef_slip_mgt_num AS bef_slip_mgt_num, + CASE conv.conv_cd + WHEN 1 THEN bio.err_flg11 + WHEN 2 THEN bio.err_flg12 + WHEN 3 THEN bio.err_flg13 + END AS lot_no_err_flg, + CASE bio.err_flg20 + WHEN 'M' THEN '*' + ELSE NULL + END AS iko_flg, + CASE bio.rec_sts_kbn + WHEN '0' THEN bio.rec_sts_kbn + WHEN '1' THEN + CASE conv.conv_cd + WHEN 1 THEN bio.err_flg11 + WHEN 2 THEN bio.err_flg12 + WHEN 3 THEN bio.err_flg13 + END + END AS rec_sts_kbn, + CASE + WHEN bio.bef_slip_mgt_num IS NOT NULL THEN bio.ins_dt + ELSE NULL + END AS ins_dt, + CASE + WHEN bio.bef_slip_mgt_num IS NOT NULL THEN bio.ins_usr + ELSE NULL + END AS ins_usr, + bio.dwh_upd_dt AS dwh_upd_dt, + /* 施設情報は後ほどセットする */ + -- 施設コード + NULL AS inst_cd, + -- 正式施設名(漢字) + NULL AS inst_name_form, + -- 施設住所 + NULL AS address, + -- 施設電話番号 + NULL AS tel_num, + CASE conv.conv_cd + WHEN 1 THEN + CASE bio.err_flg11 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済)' + WHEN '6' THEN 'ロット不明' + WHEN '7' THEN '除外' + WHEN '8' THEN '除外' + WHEN 'Z' THEN '除外' + END + WHEN 2 THEN + CASE bio.err_flg12 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済)' + WHEN '6' THEN 'ロット不明' + WHEN '7' THEN '除外' + WHEN '8' THEN '除外' + WHEN 'Z' THEN '除外' + END + WHEN 3 THEN + CASE bio.err_flg13 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済)' + WHEN '6' THEN 'ロット不明' + WHEN '7' THEN '除外' + WHEN '8' THEN '除外' + WHEN 'Z' THEN '除外' + END + END AS data_kbn, + CASE bio.slip_org_kbn + WHEN 'J' THEN 'JD-NET' + WHEN 'N' THEN 'NHI' + WHEN 'H' THEN '手入力' + END AS data_kind, + CASE conv.conv_cd + WHEN 1 THEN + CASE bio.err_flg11 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + WHEN 2 THEN + CASE bio.err_flg12 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + WHEN 3 THEN + CASE bio.err_flg13 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + END AS err_dtl_kind, + NULL AS expr_dt + FROM + src05.bio_sales bio + -- 生物由来変換マスタ + CROSS JOIN src05.bio_conv conv + WHERE + bio.err_flg1 = '0' + AND bio.err_flg2 = '0' + AND bio.err_flg3 = '0' + AND bio.err_flg4 = '0' + AND bio.err_flg5 = '0' + AND bio.err_flg6 = '0' + AND bio.err_flg7 = '0' + AND bio.err_flg8 = '0' + AND bio.err_flg9 = '0' + AND bio.err_flg10 = '0' + AND bio.rec_sts_kbn <> '99' + AND DATE(bio.dwh_upd_dt) >= src05.get_syor_date() + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの作成に失敗') + raise e + logger.debug('生物由来ロット分解データの作成に成功') + + +def _delete_empty_lot_record(db: Database): + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除開始') + try: + elapsed_time = ElapsedTime() + sql = """ + DELETE FROM src05.bio_sales_lot lot + WHERE + -- 空白15桁のデータはロット情報が空とみなして削除する + lot.rec_lot_num = REPEAT(' ', 15) OR lot.rec_lot_num IS NULL + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除に失敗') + raise e + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除に成功') + + +def _set_inst_info_from_mdb_or_mst_inst(db: Database): + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.bio_sales_lot bio + LEFT OUTER JOIN internal05.view_mdb_cnv_mst mdb + ON bio.v_inst_cd = mdb.hco_vid_v + LEFT OUTER JOIN src05.mst_inst inst + ON bio.v_inst_cd = inst.inst_cd + SET + -- 施設コード + bio.inst_cd = ( + CASE + WHEN mdb.mdb_cd IS NOT NULL THEN mdb.mdb_cd + ELSE bio.v_inst_cd + END + ), + -- 正式施設名(漢字) + bio.inst_name_form = ( + CASE + WHEN mdb.mdb_cd IS NOT NULL THEN mdb.inst_name_form + ELSE inst.inst_name_form + END + ), + -- 施設住所 + bio.address = ( + CASE + WHEN mdb.mdb_cd IS NOT NULL THEN mdb.address + ELSE inst.address + END + ), + -- 施設電話番号 + bio.tel_num = ( + CASE + WHEN mdb.mdb_cd IS NOT NULL THEN mdb.tel_num + ELSE inst.tel_num + END + ) + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに失敗') + raise e + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに成功') + + +def _set_prd_info_from_v_prd_mst(db: Database): + logger.debug('V製品マスタから製品情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.bio_sales_lot bio + LEFT OUTER JOIN src05.phm_prd_mst_v prd + ON bio.comm_cd = prd.prd_cd + AND STR_TO_DATE(bio.rev_hsdnymd_srk,'%Y%m%d') BETWEEN prd.start_date AND prd.end_date + AND prd.rec_sts_kbn <> '9' + SET + bio.mkr_inf_1 = prd.mkr_inf_1, + bio.mkr_cd = prd.mkr_cd + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('V製品マスタから製品情報を生物由来ロット分解データにセットに失敗') + raise e + logger.debug('V製品マスタから製品情報を生物由来ロット分解データにセットに成功') + + +def _set_expr_dt_from_lot_num_mst(db: Database): + # 製造ロット管理番号マスタから有効期限をセット + logger.debug('製造ロット管理番号マスタから有効期限をセット開始') + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.bio_sales_lot bio + LEFT OUTER JOIN src05.lot_num_mst lot + ON bio.mkr_cd = lot.ser_num + AND bio.rec_lot_num = lot.lot_num + SET + bio.expr_dt = lot.expr_dt + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('製造ロット管理番号マスタから有効期限をセットに失敗') + raise e + logger.debug('製造ロット管理番号マスタから有効期限をセットに成功') diff --git a/ecs/jskult-batch-daily/src/batch/common/__init__.py b/ecs/jskult-batch-daily/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_context.py b/ecs/jskult-batch-daily/src/batch/common/batch_context.py new file mode 100644 index 00000000..b3fc4967 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/batch_context.py @@ -0,0 +1,48 @@ +class BatchContext: + __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) + __is_not_business_day: bool # 日次バッチ起動日フラグ + __is_ultmarc_imported: bool # アルトマーク取込実施済フラグ + __is_vjsk_stock_import_day: bool # 卸在庫データ取込対象フラグ + + def __init__(self) -> None: + self.__is_not_business_day = False + self.__is_ultmarc_imported = False + + @classmethod + def get_instance(cls): + if cls.__instance is None: + cls.__instance = cls() + return cls.__instance + + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + + @property + def is_not_business_day(self): + return self.__is_not_business_day + + @is_not_business_day.setter + def is_not_business_day(self, flag: bool): + self.__is_not_business_day = flag + + @property + def is_ultmarc_imported(self): + return self.__is_ultmarc_imported + + @is_ultmarc_imported.setter + def is_ultmarc_imported(self, flag: bool): + self.__is_ultmarc_imported = flag + + @property + def is_vjsk_stock_import_day(self): + return self.__is_vjsk_stock_import_day + + @is_vjsk_stock_import_day.setter + def is_vjsk_stock_import_day(self, flag: bool): + self.__is_vjsk_stock_import_day = flag diff --git a/ecs/jskult-batch-daily/src/batch/common/calendar_file.py b/ecs/jskult-batch-daily/src/batch/common/calendar_file.py new file mode 100644 index 00000000..b456f03c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/calendar_file.py @@ -0,0 +1,32 @@ +from src.system_var import constants + + +class CalendarFile: + """カレンダーファイル""" + + __calendar_file_lines: list[str] + + def __init__(self, calendar_file_path): + with open(calendar_file_path) as f: + self.__calendar_file_lines: list[str] = f.readlines() + + def compare_date(self, date_str: str) -> bool: + """与えられた日付がカレンダーファイル内に含まれているかどうか + カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提 + コメント(#)が含まれている行は無視される + + Args: + date_str (str): yyyy/mm/dd文字列 + + Returns: + bool: 含まれていればTrue + """ + for calendar_date in self.__calendar_file_lines: + # コメント行が含まれている場合はスキップ + if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: + continue + + if date_str in calendar_date: + return True + + return False 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 new file mode 100644 index 00000000..294fe004 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py @@ -0,0 +1,167 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ作成') + + +def exec(): + """DCF施設統合マスタ作成""" + + # アルトマーク取込が行われていない場合は処理をスキップする + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') + return + + db = Database.get_instance() + try: + db.connect() + db.to_jst() + db.begin() + logger.debug('DCF施設統合マスタ作成処理開始') + # COM施設からDCF施設統合マスタに登録 + (is_add_dcf_inst_merge, duplication_inst_records) = _insert_dcf_inst_merge_from_com_inst(db) + db.commit() + # DCF施設統合マスタ追加のログを出力する + if is_add_dcf_inst_merge: + logger.info('[NOTICE]DCF施設統合マスタが追加されました。') + _output_add_dcf_inst_merge_log(duplication_inst_records) + logger.debug('DCF施設統合マスタ作成処理終了') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _insert_dcf_inst_merge_from_com_inst(db: Database) -> tuple[bool, list[dict]]: + # com_instからdcf_inst_mergeにinsert + # 重複コードがあるデータを取得する(処理日~システム日付を対象) + try: + sql = """ + SELECT + ci.dcf_dsf_inst_cd AS dcf_dsf_inst_cd, + ci.form_inst_name_kanji AS form_inst_name_kanji, + ci.dup_opp_cd AS dup_opp_cd, + ( + SELECT + dupci.form_inst_name_kanji + FROM + src05.com_inst AS dupci + WHERE + dupci.dcf_dsf_inst_cd = ci.dup_opp_cd + ) AS dup_inst_name_kanji, + DATE_FORMAT((src05.get_syor_date() + INTERVAL 1 MONTH), '%Y%m') AS sys_update_date + FROM + src05.com_inst AS ci + WHERE + CHAR_LENGTH(ci.dup_opp_cd) > 0 + AND ci.delete_sche_reason_cd = 'D' + AND ci.abolish_ymd IS NULL + AND ci.sys_update_date BETWEEN src05.get_syor_date() AND SYSDATE() + AND NOT EXISTS ( + SELECT + dim.dcf_inst_cd + FROM + src05.dcf_inst_merge AS dim + WHERE + dim.dcf_inst_cd = ci.dcf_dsf_inst_cd + ) + AND ( + EXISTS ( + SELECT + eci.inst_cd + FROM + src05.emp_chg_inst AS eci + WHERE + eci.inst_cd = ci.dcf_dsf_inst_cd + ) + OR ( + SELECT + sl.inst_cd + FROM + src05.sales_lau AS sl + WHERE + sl.inst_cd = ci.dcf_dsf_inst_cd + ) + ) + """ + duplication_inst_records = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('施設統合対象データの取得に成功') + except Exception as e: + logger.debug('施設統合対象データの取得に失敗') + raise e + + if len(duplication_inst_records) == 0: + logger.info('施設統合対象データはありません') + return (False, None) + + # DCF施設統合マスタ追加 + values_clauses = [] + params = {} + for clauses_no, row in enumerate(duplication_inst_records, start=1): + dcf_inst_cd_arr = f'dcf_inst_cd{clauses_no}' + dup_opp_cd_arr = f'dup_opp_cd{clauses_no}' + tekiyo_month_arr = f'tekiyo_month{clauses_no}' + values_clause = f'(:{dcf_inst_cd_arr}, :{dup_opp_cd_arr}, :{tekiyo_month_arr}, "Y", CURRENT_USER(), SYSDATE(), CURRENT_USER(), SYSDATE())' + values_clauses.append(values_clause) + params[dcf_inst_cd_arr] = row['dcf_dsf_inst_cd'] + params[dup_opp_cd_arr] = row['dup_opp_cd'] + params[tekiyo_month_arr] = row['sys_update_date'] + + insert_sql = f""" + INSERT INTO + src05.dcf_inst_merge ( + dcf_inst_cd, + dup_opp_cd, + tekiyo_month, + enabled_flg, + creater, + create_date, + updater, + update_date + ) VALUES + {','.join(values_clauses)} + """ + + try: + elapsed_time = ElapsedTime() + res = db.execute(insert_sql, params) + logging_sql(logger, insert_sql) + logger.info(f'COM施設からDCF施設統合マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('COM施設からDCF施設統合マスタの登録に失敗') + raise e + + return (True, duplication_inst_records) + + +def _output_add_dcf_inst_merge_log(duplication_inst_records: list[dict]): + sys_update_date = duplication_inst_records[0]['sys_update_date'] + set_year_month = '{set_year}年{set_month}月'.format( + set_year=sys_update_date[0:4], + set_month=sys_update_date[-2:] + ) + + add_dct_inst_merge = 'DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}' + add_dct_inst_merge_list = [] + for row in duplication_inst_records: + add_dct_inst_merge_list.append(add_dct_inst_merge.format(**row)) + add_dct_inst_merge_list = '\n'.join(add_dct_inst_merge_list) + + # 顧客報告用にログ出力 + logger.info( + f"""DCF施設統合マスタが追加されました。 +********************************************************** +適用月度 {set_year_month} +********************************************************** +{add_dct_inst_merge_list} +********************************************************** +合計 {len(duplication_inst_records)}件""" + ) + return 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 new file mode 100644 index 00000000..85de15ed --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -0,0 +1,648 @@ +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 +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ日次更新') + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.to_jst() + db.begin() + logger.debug('DCF施設統合マスタ日次更新処理開始') + # DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』) + enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db) + # DCF施設統合マスタ移行先コードのセット(無効フラグが『1(無効)』) + _set_disabled_dct_inst_merge(db) + # DCF施設統合マスタに無効フラグが『0(有効)』データが存在する場合 + if len(enabled_dst_inst_merge_records) > 0: + _add_emp_chg_inst(db, enabled_dst_inst_merge_records) + _add_ult_ident_presc(db, enabled_dst_inst_merge_records) + db.commit() + logger.debug('DCF施設統合マスタ日次更新処理終了') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _set_enabled_dct_inst_merge(db: Database) -> list[dict]: + # データ取得(無効フラグが『0(有効)』) + enabled_dst_inst_merge_records = _select_dct_inst_merge(db, 0) + # 移行先DCF施設コードの更新(無効フラグが『0(有効)』) + if _update_dcf_inst_merge(db, 0) > 0: + # DCF施設統合マスタの過去分の洗い替え + for row in enabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd'], '') + + return enabled_dst_inst_merge_records + + +def _set_disabled_dct_inst_merge(db: Database): + # データ取得(無効フラグが『1(無効)』) + disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1) + # 移行先DCF施設コードの更新(無効フラグが『1(無効)』) + if _update_dcf_inst_merge(db, 1) > 0: + # DCF施設統合マスタの過去分の洗い替え + for row in disabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') + + +def _select_ult_ident_presc_dcf_inst_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 納入先処方元マスタから、DCF施設コードに対応したレコードの取得 + try: + sql = """ + SELECT + ta_cd, + ult_ident_cd, + ratio + FROM + src05.ult_ident_presc + WHERE + presc_cd = :dcf_inst_cd + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date + """ + params = {'dcf_inst_cd': dcf_inst_cd} + ult_ident_presc_ta_cd_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('納入先処方元マスタからDCF施設コードに対応したレコードの取得に成功') + except Exception as e: + logger.debug('納入先処方元マスタからDCF施設コードに対応したレコードの取得に失敗') + raise e + + return ult_ident_presc_ta_cd_records + + +def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): + # 納入先処方元マスタの追加 + logger.info('納入先処方元マスタの登録 開始') + for data_inst_cnt, enabled_merge_record in enumerate(enabled_dst_inst_merge_records, start=1): + tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) + ult_ident_presc_source_records = _select_ult_ident_presc_dcf_inst_cd(db, enabled_merge_record['dcf_inst_cd']) + for ult_ident_presc_source_record in ult_ident_presc_source_records: + ult_ident_presc_records = _select_ult_ident_presc(db, + enabled_merge_record['dcf_inst_cd'], + enabled_merge_record['dup_opp_cd'], + ult_ident_presc_source_record) + for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): + logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') + # 処方元コード=重複時相手先コードが発生した場合 + if ult_ident_presc_row['opp_count'] > 0: + continue + + start_date = _str_to_date_time(ult_ident_presc_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + set_start_date = _date_time_to_str(set_start_date) + is_exists_duplicate_key = False + if _count_duplicate_ult_ident_presc(db, set_start_date, ult_ident_presc_row) > 0: + _delete_ult_ident_presc(db, set_start_date, ult_ident_presc_row, + '納入先処方元マスタの重複予定データの削除') + is_exists_duplicate_key = True + else: + logger.info('納入先処方元マスタの重複予定データなし') + _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) + + # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 + if not is_exists_duplicate_key and _str_to_date_time(ult_ident_presc_row['end_date']) >= start_date: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + + logger.info('納入先処方元マスタの登録 終了') + + +def _select_emp_chg_inst_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 従業員担当施設マスタから、DCF施設コードに対応した領域コードの取得 + try: + sql = """ + SELECT + ta_cd + FROM + src05.emp_chg_inst + WHERE + inst_cd = :dcf_inst_cd + AND enabled_flg = 'Y' + 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) + logging_sql(logger, sql) + logger.info('従業員担当施設マスタから領域コードの取得に成功') + except Exception as e: + logger.debug('従業員担当施設マスタから領域コードの取得に失敗') + raise e + + return emp_chg_inst_ta_cd_records + + +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_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']) + for emp_chg_inst_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_chg_inst_row['opp_count'] > 0: + continue + + start_date = _str_to_date_time(emp_chg_inst_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + + _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), + emp_chg_inst_row) + + # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 + if start_date < tekiyo_month_first_day: + # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), + 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'], + emp_chg_inst_row['start_date']) + + logger.info('従業員担当施設マスタの登録 終了') + + +def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: dict, + log_message: str): + # ult_ident_prescのDelete + try: + elapsed_time = ElapsedTime() + sql = """ + DELETE FROM + src05.ult_ident_presc + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :start_date + """ + params = { + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': start_date + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug(f'{log_message} 失敗') + raise e + + +def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): + # emp_chg_instをUPDATE + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.emp_chg_inst + SET + enabled_flg = 'N', + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + inst_cd = :dcf_inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'start_date': start_date} + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタのYorNフラグ更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('従業員担当施設マスタのYorNフラグ更新に失敗') + raise e + + +def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, + emp_chg_inst_row: dict): + # emp_chg_instをUPDATE + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.emp_chg_inst + SET end_date = :end_date, + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + inst_cd = :dcf_inst_cd + AND ta_cd = :ta_cd + AND emp_cd = :emp_cd + AND bu_cd = :bu_cd + AND start_date = :start_date + """ + params = { + 'end_date': last_end_date, + 'dcf_inst_cd': dcf_inst_cd, + 'ta_cd': emp_chg_inst_row['ta_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'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタの適用終了日更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('従業員担当施設マスタの適用終了日更新 失敗') + raise e + + +def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, + emp_chg_inst_row: dict): + # emp_chg_instにINSERT + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.emp_chg_inst( + inst_cd, + ta_cd, + emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date + ) + VALUES( + :dup_opp_cd, + :ta_cd, + :emp_cd, + :bu_cd, + :start_date, + :end_date, + :main_chg_flg, + 'Y', + CURRENT_USER(), + SYSDATE(), + CURRENT_USER(), + SYSDATE() + ) + """ + params = { + 'dup_opp_cd': dup_opp_cd, + 'ta_cd': emp_chg_inst_row['ta_cd'], + 'emp_cd': emp_chg_inst_row['emp_cd'], + 'bu_cd': emp_chg_inst_row['bu_cd'], + 'start_date': set_start_date, + 'end_date': emp_chg_inst_row['end_date'], + 'main_chg_flg': None + if emp_chg_inst_row['main_chg_flg'] is None else emp_chg_inst_row['main_chg_flg'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタの追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('従業員担当施設マスタの追加に失敗') + raise e + + +def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: + # dcf_inst_mergeからSELECT + # 無効フラグがOFFのときは、移行先DCF施設コードが設定されてないデータを抽出する。 + # ONのときは、移行先DCF施設コードが設定されているデータを抽出する。 + try: + sql = """ + SELECT + dim.dcf_inst_cd, + dim.dup_opp_cd, + dim.tekiyo_month + FROM + src05.dcf_inst_merge AS dim + INNER JOIN + src05.hdke_tbl AS ht + ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') + WHERE + dim.muko_flg = :muko_flg + AND dim.enabled_flg = 'Y' + AND dim.dcf_inst_cd_new IS {not_null}NULL + """.format( + not_null='' if muko_flg == 0 else 'NOT ' + ) + params = { + 'muko_flg': muko_flg + } + dst_inst_merge_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('DCF施設統合マスタの取得に成功') + except Exception as e: + logger.debug('DCF施設統合マスタの取得に失敗') + raise e + + return dst_inst_merge_records + + +def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: + # dcf_inst_mergeをUPDATE + # 無効フラグがOFFのときは、 + # 移行先DCF施設コードが設定されていないデータを抽出し、移行先DCF施設コードに重複時相手先コードを上書きする + # 無効フラグがONのときは、 + # 移行先DCF施設コードが設定されているデータを抽出し、移行先DCF施設コードにNULLを上書きする。 + try: + elapsed_time = ElapsedTime() + log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' + sql = """ + UPDATE + src05.dcf_inst_merge AS updim + INNER JOIN( + SELECT + dim.dcf_inst_cd AS base_dcf_inst_cd, + dim.dup_opp_cd AS base_dup_opp_cd, + dim.tekiyo_month AS base_tekiyo_month, + dim.muko_flg AS base_muko_flg, + dim.enabled_flg AS base_enabled_flg + FROM + src05.dcf_inst_merge AS dim + INNER JOIN + src05.hdke_tbl AS ht + ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') + WHERE + dim.muko_flg = :muko_flg + AND dim.enabled_flg ='Y' + AND dim.dcf_inst_cd_new IS {not_null}NULL + ) AS bf_dim + SET + updim.dcf_inst_cd_new = {column}, + updim.updater = CURRENT_USER(), + updim.update_date = SYSDATE() + WHERE + updim.dcf_inst_cd = base_dcf_inst_cd + AND updim.dup_opp_cd = base_dup_opp_cd + AND updim.tekiyo_month = base_tekiyo_month + AND updim.muko_flg = base_muko_flg + AND updim.enabled_flg = base_enabled_flg + """.format( + not_null='' if muko_flg == 0 else 'NOT ', + column='base_dup_opp_cd' if muko_flg == 0 else 'NULL' + ) + params = { + 'muko_flg': muko_flg + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'DCF施設統合マスタの有効データを{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug(f'DCF施設統合マスタの有効データを{log_message} 失敗') + raise e + + return res.rowcount + + +def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str, log_message: str): + # dcf_inst_mergeをUPDATE + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.dcf_inst_merge + SET + dcf_inst_cd_new = :dcf_inst_cd_new_after, + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + dcf_inst_cd_new = :dcf_inst_cd_new_before + AND enabled_flg = 'Y' + AND muko_flg = 0 + """ + params = { + 'dcf_inst_cd_new_after': dcf_inst_cd_new_after, + 'dcf_inst_cd_new_before': dcf_inst_cd_new_before + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'移行先DCF施設コードの{log_message}更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug(f'移行先DCF施設コードの{log_message}更新に失敗') + raise e + + +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: dict): + # ult_ident_presc_endをUPDATE + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.ult_ident_presc + SET end_date = :end_date, + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :start_date + """ + params = { + 'end_date': last_end_date, + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': ult_ident_presc_row['start_date'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'終了日 > 開始月のため適用終了日を更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('終了日 > 開始月のため適用終了日を更新 失敗') + raise e + + +def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, + ult_ident_presc_row: dict): + # ult_ident_prescにINSERT + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.ult_ident_presc( + ta_cd, + ult_ident_cd, + ratio, + start_date, + presc_cd, + end_date, + creater, + create_date, + update_date, + updater + ) + VALUES( + :ta_cd, + :ult_ident_cd, + :ratio, + :start_date, + :presc_cd, + :end_date, + CURRENT_USER(), + SYSDATE(), + SYSDATE(), + CURRENT_USER() + ) + """ + params = { + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': set_Start_Date, + 'presc_cd': dup_opp_cd, + 'end_date': ult_ident_presc_row['end_date'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'納入先処方元マスタに追加 成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('納入先処方元マスタに追加 失敗') + raise e + + +def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: + # emp_chg_instからSELECT + try: + sql = """ + SELECT + eci.inst_cd, + eci.ta_cd, + eci.emp_cd, + eci.bu_cd, + eci.start_date, + eci.end_date, + eci.main_chg_flg, + eci.enabled_flg, + ( + SELECT + COUNT(eciopp.inst_cd) + FROM + src05.emp_chg_inst AS eciopp + WHERE + eciopp.inst_cd = :dup_opp_cd + AND eciopp.ta_cd = :ta_cd + ) AS opp_count + FROM + src05.emp_chg_inst AS eci + WHERE + eci.inst_cd = :dcf_inst_cd + AND eci.ta_cd = :ta_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} + emp_chg_inst_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('従業員担当施設マスタの取得 成功') + except Exception as e: + logger.debug('従業員担当施設マスタの取得 失敗') + raise e + return emp_chg_inst_records + + +def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, + ult_ident_presc_row: dict) -> list[dict]: + # ult_ident_prescからSELECT + try: + sql = """ + SELECT + uip.ta_cd, + uip.ult_ident_cd, + uip.ratio, + uip.start_date, + uip.end_date, + ( + SELECT + COUNT(uipopp.ta_cd) + FROM + src05.ult_ident_presc AS uipopp + WHERE + uipopp.presc_cd = :dup_opp_cd + AND uipopp.ta_cd = :ta_cd + AND uipopp.ult_ident_cd = :ult_ident_cd + AND uipopp.ratio = :ratio + ) AS opp_count + FROM + src05.ult_ident_presc AS uip + WHERE + uip.presc_cd = :dcf_inst_cd + AND uip.ta_cd = :ta_cd + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date + """ + params = { + 'dcf_inst_cd': dcf_inst_cd, + 'dup_opp_cd': dup_opp_cd, + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'] + } + ult_ident_presc_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('納入先処方元マスタの取得 成功') + except Exception as e: + logger.debug('納入先処方元マスタの取得 失敗') + raise e + return ult_ident_presc_records + + +def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str, + ult_ident_presc_row: dict) -> int: + # ult_ident_prescの重複時相手先コードの件数取得 + try: + sql = """ + SELECT + COUNT(ta_cd) AS cnt + FROM + src05.ult_ident_presc + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :start_date + """ + params = { + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': set_start_date + } + result = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('納入先処方元マスタの重複予定データの存在チェック 成功') + except Exception as e: + logger.debug('納入先処方元マスタの重複予定データの存在チェック 失敗') + raise e + return result[0]['cnt'] + + +def _get_first_day_of_month(year_month: str) -> datetime: + # year_monthの初日の日付を日付型に変換し返却する + return datetime.strptime(year_month + '01', '%Y%m%d') + + +def _str_to_date_time(str_date_time: str) -> datetime: + # str_date_timeを日付型に変換して返却する + return datetime.strptime(str_date_time, '%Y%m%d') + + +def _date_time_to_str(date_time: datetime) -> str: + # date_timeをYmd型に変換して返却する + return date_time.strftime('%Y%m%d') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/__init__.py b/ecs/jskult-batch-daily/src/batch/laundering/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py new file mode 100644 index 00000000..0fee58d5 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py @@ -0,0 +1,32 @@ +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('洗替用マスタ作成') + + +def exec(): + db = Database.get_instance() + + try: + db.connect() + + logger.debug('処理開始') + db.to_jst() + call_v_inst_merge_t_create(db) + call_inst_merge_t_create(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def call_v_inst_merge_t_create(db: Database): + db.execute('CALL src05.v_inst_merge_t_create()') + return + + +def call_inst_merge_t_create(db: Database): + db.execute('CALL src05.inst_merge_t_create()') + return 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 new file mode 100644 index 00000000..8ec3b84e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -0,0 +1,178 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('施設担当者マスタ洗替') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.to_jst() + logger.debug('##########################') + logger.debug('START Changing Employee in charge of institution PGM.') + # `emp_chg_inst_lau`をTruncate + _truncate_emp_chg_inst_lau(db) + # emp_chg_inst から、`emp_chg_inst_lau`へInsert + _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) + # v_inst_merge_tから、emp_chg_inst_lauをUpdate + _update_emp_chg_inst_lau_from_v_inst_merge_t(db) + # inst_merge_tから、emp_chg_inst_lauをUpdate + _update_emp_chg_inst_lau_from_inst_merge_t(db) + logger.debug('##########################') + logger.debug('End All Processing PGM.') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_emp_chg_inst_lau(db: Database): + logger.debug("##########################") + try: + db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") + except Exception as e: + logger.debug("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") + raise e + + logger.debug("Table `emp_chg_inst_lau` was truncated!") + return + + +def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): + logger.debug("##########################") + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.emp_chg_inst_lau + SELECT + inst_cd, + ta_cd,emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date, + NULL -- lua_ope_dt + FROM + src05.emp_chg_inst + WHERE + enabled_flg = 'Y' + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") + raise e + logger.debug("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") + + return + + +def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database): + # v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする + logger.debug("##########################") + try: + select_result = db.execute_select( + """ + SELECT + COUNT(v_inst_cd) AS row_count + FROM + internal05.v_inst_merge_t + """ + ) + except Exception as e: + logger.debug("Error! `v_inst_merge_t` Table count error!") + raise e + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('v_inst_merge_t Table Data is not exists!') + return + + logger.info('v_inst_merge_t Table Data is exists!') + # v_inst_merge_t から、emp_chg_inst_lauをUpdateします + logger.debug("##########################") + logger.debug("#### UPDATE DATA #########") + logger.debug("##########################") + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.emp_chg_inst_lau el, internal05.v_inst_merge_t vimt + SET + el.inst_cd = vimt.v_inst_cd_merge, + el.lua_ope_dt = SYSDATE() + WHERE + el.inst_cd = vimt.v_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug("emp_chg_inst_lau.v_inst_cd could not set!") + raise e + + logger.debug("emp_chg_inst_lau.v_inst_cd was set!") + + return + + +def _update_emp_chg_inst_lau_from_inst_merge_t(db: Database): + # inst_merge_tから、emp_chg_inst_lauをUpdate + # Get count from INST_MERGE_T + logger.debug("##########################") + try: + select_result = db.execute_select( + """ + SELECT + COUNT(dcf_dsf_inst_cd) AS row_count + FROM + internal05.inst_merge_t + """ + ) + except Exception as e: + logger.debug("Error! Getting Count of internal05.inst_merge_t was failed!") + raise e + + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('inst_merge_t Table Data is not exists!') + return + + logger.debug('inst_merge_t Table Data is exists!') + # inst_merge_tから、emp_chg_inst_lauをUpdate + logger.debug("##########################") + logger.debug("#### UPDATE DATA #########") + logger.debug("##########################") + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.emp_chg_inst_lau el, internal05.inst_merge_t imt + SET + el.inst_cd = imt.dup_opp_cd, + el.lua_ope_dt = SYSDATE() + WHERE + el.inst_cd = imt.dcf_dsf_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug("emp_chg_inst_lau.v_inst_cd could not set!") + raise e + + logger.debug("emp_chg_inst_lau.v_inst_cd was set!") + + return diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py new file mode 100644 index 00000000..783b7db2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -0,0 +1,269 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +batch_context = BatchContext.get_instance() +logger = get_logger('メルク施設マスタ作成') + + +def exec(): + """メルク施設マスタ作成""" + + # 営業日ではないかつ、アルトマーク取込が行われていない場合は処理をスキップする + if batch_context.is_not_business_day is True and batch_context.is_ultmarc_imported is not True: + logger.info('営業日ではない、かつ、アルトマーク取込が行われていないため、メルク施設マスタ作成処理をスキップします。') + return + + db = Database.get_instance() + try: + db.connect() + logger.debug('メルク施設マスタ作成処理開始') + # mst_instをTruncate + _truncate_mst_inst(db) + # fcl_mst_vから、mst_instへInsert + _insert_mst_inst_from_fcl_mst_v(db) + # com_instから、mst_instへInsert + _insert_mst_inst_from_com_inst(db) + logger.debug('メルク施設マスタ作成処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_mst_inst(db: Database): + try: + db.execute("TRUNCATE TABLE src05.mst_inst") + except Exception as e: + logger.debug("メルク施設マスタの全件削除に失敗") + raise e + + logger.debug("メルク施設マスタの全件削除に成功") + return + + +def _insert_mst_inst_from_fcl_mst_v(db: Database): + # fcl_mst_vから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + delete_date, + v_inst_cd, + create_date, + update_date + ) + SELECT + fmv1.v_inst_cd, + CASE + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN '3' + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' + END AS inst_clas_cd, + fmv1.fcl_name, + fmv1.fcl_abb_name, + fmv1.prft_cd, + RIGHT(fmv1.admin_kbn, 3), + mp.prefc_name, + LEFT(mc.city_name, 40), + CASE + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN LEFT(fmv1.fmt_addr, 200) + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) + END AS address, + fmv1.postal_cd, + fmv1.tel_num, + CASE + WHEN + fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) + WHEN + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y-%m-%d") + ELSE + null + END AS delete_date, + fmv1.v_inst_cd, + fmv1.ins_dt, + fmv1.upd_dt + FROM + src05.fcl_mst_v AS fmv1 + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) fmv2 + ON fmv1.v_inst_cd = fmv2.v_inst_cd + AND fmv1.sub_num = fmv2.sno + LEFT OUTER JOIN src05.mst_prefc AS mp + ON fmv1.prft_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON LEFT(fmv1.admin_kbn, 2) = mc.prefc_cd + AND RIGHT(fmv1.admin_kbn, 3) = mc.city_cd + WHERE + ((fmv1.fcl_type IN ('A1', 'A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') + AND fmv1.rec_sts_kbn != '9' + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'V施設マスタからメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("V施設マスタからメルク施設マスタに登録失敗") + raise e + + return + + +def _insert_mst_inst_from_com_inst(db: Database): + # オプティマイザのderived_mergeフラグをoffにする + try: + sql = """ + SET SESSION optimizer_switch = 'derived_merge=off' + """ + db.execute(sql) + logger.debug("オプティマイザのderived_mergeフラグ = Off") + except Exception as e: + logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") + raise e + + # com_instから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + bed_num, + manage_cd, + manage_name, + delete_date, + inst_div_cd, + inst_div_name, + v_inst_cd, + creater, + create_date, + updater, + update_date + ) + SELECT + ci.dcf_dsf_inst_cd, + '1', + ci.form_inst_name_kanji, + ci.inst_name_kanji, + ci.prefc_cd, + ci.city_cd, + mp.prefc_name, + LEFT(mc.city_name, 40), + ci.inst_addr, + ci.postal_number, + ci.inst_phone_number, + ci.bed_num, + ci.manage_cd, + LEFT(cm.manage_name, 40), + ci.abolish_ymd, + ci.inst_div_cd, + LEFT(cid.inst_div_name, 40), + mcmv.hco_vid_v, + ci.create_user, + ci.regist_date, + ci.update_user, + ci.update_date + FROM + src05.com_inst AS ci + LEFT OUTER JOIN src05.mst_prefc AS mp + ON ci.prefc_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON ci.prefc_cd = mc.prefc_cd + AND ci.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON ci.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON ci.inst_div_cd = cid.inst_div_cd + LEFT OUTER JOIN ( -- MDBコード変換表を使用してV施設コードを取得するためのテーブル結合 + SELECT + mcmv4.* + FROM ( + SELECT + mcmv1.* + FROM + src05.mdb_cnv_mst_v AS mcmv1 + INNER JOIN ( + SELECT + mcmv2.hco_vid_v, + MAX(mcmv2.sub_num) AS sno -- MDBコード変換データの枝番MAX + FROM + src05.mdb_cnv_mst_v mcmv2 + WHERE + mcmv2.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 + AND src05.get_syor_date() >= mcmv2.start_date + GROUP BY + mcmv2.hco_vid_v + ) AS mcmv3 + ON mcmv1.hco_vid_v = mcmv3.hco_vid_v + AND mcmv1.sub_num = mcmv3.sno + ) AS mcmv4 + INNER JOIN ( + SELECT + MIN(mcmv8.hco_vid_v) AS hvv, -- 1つのMDBコードに対し、複数のV施設コードが割り当てられている場合、最小のV施設コードを選択する + mcmv8.mdb_cd + FROM ( + SELECT + mcmv5.* + FROM + src05.mdb_cnv_mst_v AS mcmv5 + INNER JOIN ( + SELECT + mcmv6.hco_vid_v, + MAX(mcmv6.sub_num) AS sno -- MDBコード変換データの枝番MAX + FROM + src05.mdb_cnv_mst_v AS mcmv6 + WHERE + mcmv6.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 + AND src05.get_syor_date() >= mcmv6.start_date + GROUP BY + mcmv6.hco_vid_v + ) AS mcmv7 + ON mcmv5.hco_vid_v = mcmv7.hco_vid_v + AND mcmv5.sub_num = mcmv7.sno + ) AS mcmv8 + GROUP BY + mcmv8.mdb_cd + ) AS mcmv9 + ON mcmv4.mdb_cd = mcmv9.mdb_cd + AND mcmv4.hco_vid_v = mcmv9.hvv + ) AS mcmv + ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'COM施設からメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("COM施設からメルク施設マスタに登録失敗") + raise e + + return diff --git a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py new file mode 100644 index 00000000..2cc530f9 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -0,0 +1,31 @@ +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.logging.get_logger import get_logger + +batch_context = BatchContext.get_instance() + +logger = get_logger('実績洗替') + + +def exec(): + """実績洗替処理""" + logger.info('実績更新:起動') + # 営業日ではない場合、実績洗替処理は実行しない + if batch_context.is_not_business_day: + logger.info('営業日ではないため、実績洗替処理をスキップします。') + return + # DCF施設統合マスタ日次更新 + integrate_dcf_inst_merge.exec() + # 洗替用マスタ作成 + create_inst_merge_for_laundering.exec() + # 施設担当者洗替 + emp_chg_inst_laundering.exec() + # 納入先処方元マスタ洗替 + ult_ident_presc_laundering.exec() + # 卸販売洗替 + sales_results_laundering.exec() + + logger.info('実績更新:終了') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py new file mode 100644 index 00000000..7af6030c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -0,0 +1,169 @@ +from src.batch.batch_functions import logging_sql +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger('卸販売洗替') + + +def exec(): + db = Database.get_instance(autocommit=True) + try: + db.connect() + db.to_jst() + logger.debug('処理開始') + # 卸販売実績テーブル(洗替後)過去データ削除 + _call_sales_lau_delete(db) + # 卸販売実績テーブル(洗替後)作成 + _call_sales_lau_upsert(db) + # 1:卸組織洗替 + _call_whs_org_laundering(db) + # 3:HCO施設コードの洗替 + _update_sales_lau_from_vop_hco_merge_v(db) + # 4:メルク施設コードの洗替 + _update_mst_inst_laundering(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _call_sales_lau_delete(db: Database): + # 卸販売実績テーブル(洗替後)過去データ削除 + logger.info('sales_lau_delete(プロシージャ―) 開始') + db.execute(f""" + CALL src05.sales_lau_delete( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}', + {environment.SALES_LAUNDERING_TARGET_YEAR_OFFSET} + ) + """) + logger.info('sales_lau_delete(プロシージャ―) 終了') + return + + +def _call_sales_lau_upsert(db: Database): + # 卸販売実績テーブル(洗替後)作成 + # sales_lau_upsertの第3引数は、NEWDWH2021-1230の対応の結果、未使用の引数となっています + logger.info('sales_lau_upsert(プロシージャ―) 開始') + db.execute(f""" + CALL src05.sales_lau_upsert( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}', + (src05.get_syor_date() - interval {environment.SALES_LAUNDERING_EXTRACT_DATE_PERIOD} day), + src05.get_syor_date() + ) + """) + logger.info('sales_lau_upsert(プロシージャ―) 終了') + return + + +def _call_whs_org_laundering(db: Database): + # 卸組織洗替 + logger.info('whs_org_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.whs_org_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('whs_org_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_vop_hco_merge_v(db: Database): + # HCO施設コードの洗替 + if _count_v_inst_merge_t(db) == 0: + logger.info('V施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + + _call_v_inst_merge_laundering(db) + return + + +def _count_v_inst_merge_t(db: Database) -> int: + # V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(v_inst_cd) AS cnt + FROM + internal05.v_inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_v_inst_merge_laundering(db: Database): + # HCO施設コードの洗替(プロシージャ―の呼び出し) + logger.info('v_inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.v_inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('v_inst_merge_laundering(プロシージャ―) 終了') + return + + +def _update_mst_inst_laundering(db: Database): + # メルク施設コードの洗替 + _call_hco_to_mdb_laundering(db) + _update_sales_lau_from_dcf_inst_merge(db) + + +def _call_hco_to_mdb_laundering(db: Database): + # A:医療機関のデータはMDB変換表からHCO⇒DCFへ変換 + logger.info('hco_to_mdb_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.hco_to_mdb_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('hco_to_mdb_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_dcf_inst_merge(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする + if _count_inst_merge_t(db) == 0: + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + _call_inst_merge_laundering(db) + return + + +def _count_inst_merge_t(db: Database) -> int: + # アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(dcf_dsf_inst_cd) AS cnt + FROM + internal05.inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_inst_merge_laundering(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(プロシージャ―の呼び出し) + logger.info('inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('inst_merge_laundering(プロシージャ―) 終了') + return diff --git a/ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py new file mode 100644 index 00000000..9776eb8d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py @@ -0,0 +1,140 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('納入先処方元マスタ洗替') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.to_jst() + logger.debug('納入先処方元マスタの洗替処理開始') + # ult_ident_presc_lauをTruncate + _truncate_ult_ident_presc_lau(db) + # ult_ident_presc から、ult_ident_presc_lauへInsert + _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db) + # v_inst_merge_tから、ult_ident_presc_lauをUpdate + _update_ult_ident_presc_lau_from_v_inst_merge_t(db) + # inst_merge_tから、ult_ident_presc_lauをUpdate + _update_ult_ident_presc_lau_from_inst_merge_t(db) + logger.debug('納入先処方元マスタの洗替処理製造終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_ult_ident_presc_lau(db: Database): + try: + db.execute("TRUNCATE TABLE src05.ult_ident_presc_lau") + except Exception as e: + logger.debug("納入先処方元マスタ(洗替後)の全件削除に失敗") + raise e + + logger.debug("納入先処方元マスタ(洗替後)の全件削除に成功") + return + + +def _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db: Database): + try: + elapsed_time = ElapsedTime() + sql = "INSERT INTO src05.ult_ident_presc_lau SELECT *, NULL FROM src05.ult_ident_presc" + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'処方元マスタから処方元マスタ(洗替後)に全件コピーに成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("処方元マスタから処方元マスタ(洗替後)に全件コピーに失敗") + raise e + + return + + +def _update_ult_ident_presc_lau_from_v_inst_merge_t(db: Database): + # v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする + try: + select_result = db.execute_select( + """ + SELECT + COUNT(v_inst_cd) AS row_count + FROM + internal05.v_inst_merge_t + """ + ) + except Exception as e: + logger.debug("V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗") + raise e + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません') + return + + logger.info(f'V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}') + + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.ult_ident_presc_lau uipl, internal05.v_inst_merge_t vimt + SET + uipl.ult_ident_cd = vimt.v_inst_cd_merge, + uipl.lau_ope_dt = SYSDATE() + WHERE + uipl.ult_ident_cd = vimt.v_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'納入先処方元マスタの納入先コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("納入先処方元マスタの納入先コードを施設コード移行先に更新失敗") + raise e + + return + + +def _update_ult_ident_presc_lau_from_inst_merge_t(db: Database): + # inst_merge_tから、ult_ident_presc_lauをUpdate + try: + select_result = db.execute_select( + """ + SELECT + COUNT(dcf_dsf_inst_cd) AS row_count + FROM + internal05.inst_merge_t + """ + ) + except Exception as e: + logger.debug("施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗") + raise e + + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません') + return + + logger.info(f'施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}') + # inst_merge_tから、ult_ident_presc_lauをUpdate + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.ult_ident_presc_lau uipl, internal05.inst_merge_t imt + SET + uipl.presc_cd = imt.dup_opp_cd, + uipl.lau_ope_dt = SYSDATE() + WHERE + uipl.presc_cd = imt.dcf_dsf_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'納入先処方元マスタの処方元コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("納入先処方元マスタの処方元コードを施設コード移行先に更新失敗") + raise e + + return diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py new file mode 100644 index 00000000..0fb2d715 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -0,0 +1,32 @@ +"""並列処理""" + +import concurrent.futures + +from src.batch.bio_sales import create_bio_sales_lot +from src.batch.laundering import sales_laundering +from src.error.exceptions import BatchOperationException + + +def exec(): + # 並列処理を開始 + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + + # 実績更新 + future_sales_laundering = executor.submit(sales_laundering.exec) + # 生物由来ロット分解 + future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec) + + # 両方の処理が完了するまで待つ + concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) + + # エラーがあれば呼び出し元でキャッチする + sales_laundering_exc = future_sales_laundering.exception() + create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() + + # いずれかにエラーが発生していれば、1つのエラーとして返す。 + if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: + sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' + create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' + raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py new file mode 100644 index 00000000..2631eaff --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -0,0 +1,60 @@ +import csv +from io import TextIOWrapper + + +class DatFileLine: + layout_class: str + records: list[str] + + def __init__(self, dat_line: list[str]) -> None: + self.layout_class = dat_line[0] + self.records = dat_line + + +class DatFile: + """アルトマークデータファイル""" + + lines: list[DatFileLine] + success_count: int = 0 + error_count: int = 0 + total_count: int = 0 + __i: int = 0 + + def __iter__(self): + return self + + def __next__(self) -> DatFileLine: + if self.__i == len(self.lines): + raise StopIteration() + line = self.lines[self.__i] + self.__i += 1 + return line + + def __init__(self, file: TextIOWrapper) -> None: + reader = csv.reader(file) + csv_rows = [DatFileLine(row) for row in reader] + + self.lines = csv_rows + self.total_count = len(csv_rows) + + def count_up_success(self): + self.success_count += 1 + + def count_up_error(self): + self.error_count += 1 + + @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) + file.close() + return instance diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py new file mode 100644 index 00000000..838dae34 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py @@ -0,0 +1,271 @@ +"""output_vjsk_inst_pharm_data""" + +from src.aws.s3 import VjskSendBucket +from src.batch.common.batch_context import BatchContext + +from src.db.database import Database +from src.logging.get_logger import get_logger +import tempfile +import os.path as path +import csv + +logger = get_logger('V実消化用施設データ作成処理') + +sql_err_msg = "SQL実行エラーです。" + + +def exec(): + vjsk_csv_file_name = 'ComInst.csv' + + # バッチ共通設定を取得 + batch_context = BatchContext.get_instance() + + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') + return + + db = Database.get_instance() + try: + logger.info('処理開始') + + try: + # DB接続 + db.connect() + except Exception as e: + logger.info('DB接続エラーです。') + raise e + + # CSVファイルの作成用のSQL実行(施設) + record_inst = select_inst_record(db) + # CSVファイルの作成用のSQL実行(薬局) + record_pharm = select_pharm_record(db) + # CSVファイル作成 + csv_file_path = make_csv_data(record_inst, record_pharm, vjsk_csv_file_name) + + vjsk_bucket = VjskSendBucket() + try: + # s3へデータ移動 + vjsk_bucket.upload_inst_pharm_csv_file(vjsk_csv_file_name, csv_file_path) + except Exception as e: + logger.info('S3バケットにCSVデータを作成できませんでした。') + raise e + + try: + # 処理後ファイルをバックアップ + vjsk_bucket.backup_inst_pharm_csv_file(vjsk_csv_file_name, batch_context.syor_date) + except Exception as e: + logger.info('バックアップバケットへCSVデータをコピーできませんでした。') + raise e + + csv_count = len(record_inst) + len(record_pharm) + logger.info(f'CSV出力件数: {csv_count}') + logger.info('正常終了') + except Exception as e: + raise e + finally: + db.disconnect() + return + + +def select_inst_record(db): + # CSVファイル作成用のSQL実行(施設) + try: + # 施設テーブル検索SQL + sql = """\ + SELECT dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + rltd_univ_prnt_cd, + bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + ward_abolish_flg, + inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + hp_assrt_cd, + dup_opp_cd, + insp_item_micrb, + insp_item_serum, + insp_item_blood, + insp_item_patho, + insp_item_paras, + insp_item_biochem, + insp_item_ri, + re_exam_cd, + prmit_bed_num_other, + prmit_bed_num_mental, + prmit_bed_num_tuber, + prmit_bed_num_infection, + prmit_bed_num_sum, + prmit_bed_num_gen, + prmit_bed_num_rcup, + prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + filler_1, + filler_2, + filler_3, + filler_4, + filler_5, + regist_date, + create_user, + update_date, + update_user, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + FROM src05.com_inst ORDER BY dcf_dsf_inst_cd + """ + return db.execute_select(sql) + except Exception as e: + logger.debug(sql_err_msg) + raise e + + +def select_pharm_record(db): + # CSVファイル作成用のSQL実行(薬局) + try: + # 薬局テーブル検索SQL + sql = """\ + SELECT dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + '' AS rltd_univ_prnt_cd, + '' AS bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + '' AS ward_abolish_flg, + '' AS inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + '' AS hp_assrt_cd, + dup_opp_cd, + '' AS insp_item_micrb, + '' AS insp_item_serum, + '' AS insp_item_blood, + '' AS insp_item_patho, + '' AS insp_item_paras, + '' AS insp_item_biochem, + '' AS insp_item_ri, + '' AS re_exam_cd, + '' AS prmit_bed_num_other, + '' AS prmit_bed_num_mental, + '' AS prmit_bed_num_tuber, + '' AS prmit_bed_num_infection, + '' AS prmit_bed_num_sum, + '' AS prmit_bed_num_gen, + '' AS prmit_bed_num_rcup, + '' AS prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + filler_1, + filler_2, + filler_3, + filler_4, + filler_5, + regist_date, + create_user, + update_date, + update_user, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + FROM src05.com_pharm ORDER BY dcf_dsf_inst_cd + """ + return db.execute_select(sql) + except Exception as e: + logger.debug(sql_err_msg) + raise e + + +def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str): + # 一時ファイルとして保存する(CSVファイル) + try: + + temporary_dir = tempfile.mkdtemp() + csv_file_path = path.join(temporary_dir, vjsk_csv_file_name) + + head_str = ['DCF_DSF_INST_CD', 'INST_DIV_CD', 'ADDR_UNKNOWN_REASON_CD', 'FORM_INST_NAME_KANA', 'INST_NAME_KANA', + 'FORM_INST_NAME_KANJI', 'INST_NAME_KANJI', 'RLTD_UNIV_PRNT_CD', 'BED_NUM', 'CLOSE_FLG', 'ESTAB_SCHE_FLG', + 'CLOSE_START_YM', 'ESTAB_SCHE_YM', 'WARD_ABOLISH_FLG', 'INST_REPRE_CD', 'INST_REPRE_KANA', 'INST_REPRE', + 'PHONE_NUMBER_NON_FLG', 'UNCONF_FLG', 'INST_PHONE_NUMBER', 'INST_ADDR_KANA', 'INST_ADDR', 'POSTAL_NUMBER', + 'VILLAGE_CD', 'PREFC_CD', 'CITY_CD', 'ADDR_DISPLAY_NUMBER', 'ADDR_CNT_KANA', 'ADDR_CNT', 'MANAGE_CD', + 'DELETE_SCHE_REASON_CD', 'HP_ASSRT_CD', 'DUP_OPP_CD', 'INSP_ITEM_MICRB', 'INSP_ITEM_SERUM', 'INSP_ITEM_BLOOD', + 'INSP_ITEM_PATHO', 'INSP_ITEM_PARAS', 'INSP_ITEM_BIOCHEM', 'INSP_ITEM_RI', 'RE_EXAM_CD', 'PRMIT_BED_NUM_OTHER', + 'PRMIT_BED_NUM_MENTAL', 'PRMIT_BED_NUM_TUBER', 'PRMIT_BED_NUM_INFECTION', 'PRMIT_BED_NUM_SUM', 'PRMIT_BED_NUM_GEN', + 'PRMIT_BED_NUM_RCUP', 'PRMIT_BED_MAINT_YMD', 'INST_PHARM_DIV', 'ABOLISH_YMD', 'DELETE_FLG', 'FILLER_1', 'FILLER_2', + 'FILLER_3', 'FILLER_4', 'FILLER_5', 'REGIST_DATE', 'CREATE_USER', 'UPDATE_DATE', 'UPDATE_USER', 'SYS_REGIST_DATE', + 'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID'] + + with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file: + # ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています) + csv_file.write(f"{','.join(head_str)}\n") + + # Shift-JIS、CRLF、価囲いありで書き込む + writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', + quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, + strict=True + ) + + # データ部分書き込み(施設) + for record_inst_data in record_inst: + record_inst_value = list(record_inst_data.values()) + csv_data = ['' if n is None else n for n in record_inst_value] + writer.writerow(csv_data) + + # データ部分書き込み(薬局) + for record_pharm_data in record_pharm: + record_pharm_value = list(record_pharm_data.values()) + csv_data = ['' if n is None else n for n in record_pharm_value] + writer.writerow(csv_data) + + except Exception as e: + logger.info('CSVデータの作成に失敗しました。') + raise e + + return csv_file_path diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py new file mode 100644 index 00000000..a5443041 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -0,0 +1,156 @@ +"""アルトマークデータ処理""" + +import json +from datetime import datetime + +from src.aws.s3 import ConfigBucket, UltmarcBucket +from src.batch.common.batch_context import BatchContext +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 BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants + +logger = get_logger('アルトマークデータ処理') +ultmarc_bucket = UltmarcBucket() +config_bucket = ConfigBucket() +batch_context = BatchContext.get_instance() + + +def exec_import(): + """アルトマーク取り込み処理""" + try: + logger.info('アルトマーク取込処理: 開始') + # datファイルをS3から取得する + dat_file_list = ultmarc_bucket.list_dat_file() + + # ファイルがない場合は処理せず、正常終了とする + if len(dat_file_list) == 0: + logger.info('取込ファイルがないため、アルトマーク取込処理をスキップします') + # アルトマークデータ受信予定曜日である月曜日は、保守ユーザーに通知する + if datetime.strptime(batch_context.syor_date, '%Y/%m/%d').weekday() == constants.WEEKDAY_MONDAY: + logger.info('[NOTICE]アルトマークデータの受信がありませんでした') + return + + # ファイルが複数ある場合はエラーとする + if len(dat_file_list) > 1: + raise BatchOperationException(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') + + # ファイルの件数は必ず1件になる + dat_file_info = dat_file_list[0] + # 0Byteの場合、 + if dat_file_info['size'] == 0: + logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}') + return + + dat_file_name = dat_file_info['filename'] + logger.info(f"{dat_file_name}を取り込みます") + # datファイルをダウンロード + local_file_path = ultmarc_bucket.download_dat_file(dat_file_name) + # 文字コード変換設定ファイルをダウンロード + convert_config_file_path = config_bucket.download_ultmarc_hex_convert_config() + # 文字コードを変換 + converted_file_path = _convert_character_hex(local_file_path, convert_config_file_path) + dat_file = DatFile.from_path(converted_file_path) + # アルトマーク取り込み実行 + _import_to_ultmarc_table(dat_file) + # 処理後ファイルをバックアップ + ultmarc_bucket.backup_dat_file(dat_file_name, batch_context.syor_date) + logger.info(f'取り込み処理が完了したため、datファイルをバックアップ。ファイル名={dat_file_name}') + # アルトマーク取込済をマーク + batch_context.is_ultmarc_imported = True + logger.info('アルトマーク取込処理: 終了') + except Exception as e: + raise BatchOperationException(e) + + +def _convert_character_hex(dat_file_path: str, config_file_path: str) -> str: + """_summary_ + アルトマークデータファイルを読み、バイトレベルで文字コードを変換して新しいファイルに書き出す。 + Args: + dat_file_path (str): 変換前のアルトマークデータファイル + config_file_path (str): 変換設定 + + Returns: + str: 文字コード変換後のアルトマークデータファイルのパス + """ + logger.debug('文字コード変換開始') + # 変換設定ファイルを読み込む + with open(config_file_path, 'r', encoding='utf-8') as f: + hex_convert_config_dict: dict = json.load(f) + with open(dat_file_path, 'rb') as org_file, open(f'{dat_file_path}.converted', 'wb') as dest_file: + while True: + first_byte = org_file.read(1) + # ファイルの末尾まで読んだらループ終了 + if not first_byte: + break + + # 読みだした1バイトが、Shift_JIS の日本語範囲(2バイト文字)に含まれる場合、もう1バイト読む + if 0x81 <= first_byte[0] <= 0x9F or 0xE0 <= first_byte[0] <= 0xFC: + second_byte = org_file.read(1) + # ファイルの末尾まで読んだらループ終了 + if not second_byte: + break + + # 2バイトを結合して、HEXの4桁(大文字)に変換 + japanese_bytes = first_byte + second_byte + japanese_hex = ''.join([hex(b)[2:].zfill(2).upper() for b in japanese_bytes]) + # 変換対象の文字を変換設定に基づいて変換する + processed_hex = hex_convert_config_dict.get(japanese_hex) + if processed_hex is None: + processed_hex = japanese_hex + + # HEXの4桁をバイト列に戻して書き出す + processed_bytes = bytes.fromhex(processed_hex) + dest_file.write(processed_bytes) + else: + # 1バイト文字はそのまま書き出す + dest_file.write(first_byte) + + logger.debug('文字コード変換終了') + + return f'{dat_file_path}.converted' + + +def _import_to_ultmarc_table(dat_file: DatFile): + db = Database.get_instance() + try: + # DB接続 + db.connect() + # ファイル単位でトランザクションを行う + db.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.info(e) + record = line.records + log_message = ','.join([f'"{r}"' for r in record]) + logger.info(f'ERROR_LINE: {log_message}') + dat_file.count_up_error() + # 処理結果をログに出力する + 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:`の行を確認してください。') + finally: + # 終了時に必ずコミットする + db.commit() + db.disconnect() + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py new file mode 100644 index 00000000..f083b9d1 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py @@ -0,0 +1,107 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_alma_depart_disc import ComAlmaDepartDisc + + +class ComAlmaDepartDiscMapper(UltmarcTableMapper): + """レイアウト区分003: COM_出身校学部識別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_alma_depart_disc + ( + alma_cd, + depart_disc_cd, + estab_e, + estab_y, + alma_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :alma_cd, + :depart_disc_cd, + :estab_e, + :estab_y, + :alma_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_alma_depart_disc + SET + estab_e = :estab_e, + estab_y = :estab_y, + alma_name = :alma_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_alma_depart_disc + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + record: ComAlmaDepartDisc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComAlmaDepartDisc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py new file mode 100644 index 00000000..9e8189bc --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -0,0 +1,92 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_alma import ComAlma + + +class ComAlmaMapper(UltmarcTableMapper): + """レイアウト区分004: COM_出身校 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_alma + WHERE + alma_cd = :alma_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_alma + ( + alma_cd, + alma, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :alma_cd, + :alma, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_alma + SET + alma = :alma, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_alma + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + """ + record: ComAlma + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComAlma) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py new file mode 100644 index 00000000..e6738d07 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py @@ -0,0 +1,105 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_blng_sec import ComBlngSec + + +class ComBlngSecMapper(UltmarcTableMapper): + """レイアウト区分008: COM_所属部科 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_blng_sec + WHERE + blng_sec_cd = :blng_sec_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_blng_sec + ( + blng_sec_cd, + blng_sec_kana, + blng_sec_name, + inst_category, + trt_category, + category_sort, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :blng_sec_cd, + :blng_sec_kana, + :blng_sec_name, + :inst_category, + :trt_category, + :category_sort, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_blng_sec + SET + blng_sec_kana = :blng_sec_kana, + blng_sec_name = :blng_sec_name, + inst_category = :inst_category, + trt_category = :trt_category, + category_sort = :category_sort, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + blng_sec_cd = :blng_sec_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_blng_sec + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + blng_sec_cd = :blng_sec_cd + """ + record: ComBlngSec + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComBlngSec) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py new file mode 100644 index 00000000..b1746e00 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py @@ -0,0 +1,108 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_cop_hp import ComCopHp + + +class ComCopHpMapper(UltmarcTableMapper): + """レイアウト区分112: COM_臨床研修病院 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_cop_hp + ( + dcf_dsf_inst_cd, + cophp_cd, + openyear, + sortkey, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :cophp_code, + :open_year, + :sort_key, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_cop_hp + SET + sortkey = :sort_key, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + record: ComCopHp + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComCopHp) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + # 更新する値が空の場合は、更新処理を行わない + if self.record.sort_key == '': + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py new file mode 100644 index 00000000..f19c10bd --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py @@ -0,0 +1,480 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr import ComDr + + +class ComDrMapper(UltmarcTableMapper): + """レイアウト区分501: COM_医師 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr + ( + dcf_pcf_dr_cd, + dr_name_kana, + dr_name, + birthday_era, + birthday_year, + birthday_month, + birthday_day, + birthday, + hometown_cd, + estab_era, + estab_year, + estab_y, + home_phone_number, + home_addr_kana, + home_addr, + home_postal_number, + addr_village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + dr_circle_cd, + estab_div_cd, + sex_cd, + delete_sche_reason_cd, + addr_unknown_reason_cd, + alma_cd, + depart_disc_cd, + grad_era, + grad_year, + grad_y, + lump_regist_flg, + opp_dup_cd, + dr_ph_div, + use_stop_div, + use_stop_reason_cd, + use_stop_regist_ymd, + use_stop_cancel_ymd, + drday_era, + drday_year, + drday_y, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcf_pcf_dr_cd, + :dr_name_kana, + :dr_name, + :birthday_era, + :birthday_year, + :birthday_month, + :birthday_day, + :birth_day, + :home_town_code, + :pract_yearera, + :pract_year, + :estab_y, + :dr_tel, + :dr_addr_kana, + :dr_addr, + :dr_zip_code, + :addr_village_cd, + :pref_code, + :city_code, + :dr_addr_num, + :addr_cnt_kana, + :addr_cnt, + :medassoci_code, + :pract_class_code, + :sex_code, + :drdel_code, + :dr_addr_lost_code, + :graduniv_code, + :graduniv_dept_code, + :grad_yearera, + :grad_year, + :grad_y, + :bskregst_flag, + :opp_dup_code, + 1, + :use_stop_flag, + :use_stopc_ode, + :cre_stop_date, + :release_date, + :drda_yera, + :drday_year, + :drday_y, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_dr + SET + {update_columns} + dr_ph_div = 1, + abolish_ymd = NULL, + delete_flg = 0, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_dr + SET + abolish_ymd = :maint_date, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 西暦取得SQL + YEAR_GET_QUERY = """\ + SELECT + year AS year + FROM + src05.com_era + WHERE + era_cd = :era_cd + """ + + # COM_医師診療科目の物理削除SQL + PHYSICAL_DELETE_QUERY_TRT = """\ + DELETE FROM + src05.com_dr_trt_course + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # COM_医師診療科目の登録用SQL + INSERT_QUERY_TRT = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + sequence, + dcf_pcf_dr_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + {trt_course_code}, + {trt_sequence}, + :dcf_pcf_dr_cd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + record: ComDr + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDr) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.__make_upsert_query() + return + + def __make_upsert_query(self): + # 西暦の取得 + self.__set_era() + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + # COM_医師診療科目 削除登録 + self.__make_delete_insert_trt_query() + return + + # 存在する場合ではUpdate + # COM_医師診療科目 削除登録 + self.__make_delete_insert_trt_query() + + update_columns = ','.join(self.__make_update_query()) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + self.queries.append(None) + return + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + return + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # 削除予定理由 + if len(self.record.drdel_code) > 0: + set_clauses.append('delete_sche_reason_cd = :drdel_code') + + # 重複時相手先コード + if len(self.record.opp_dup_code) > 0: + set_clauses.append('opp_dup_cd = :opp_dup_code') + + # 医師名(漢字) + if len(self.record.dr_name) > 0: + set_clauses.append('dr_name = :dr_name') + + # 医師名(カナ) + if len(self.record.dr_name_kana) > 0: + set_clauses.append('dr_name_kana = :dr_name_kana') + + # 性別 + if len(self.record.sex_code) > 0: + set_clauses.append('sex_cd = :sex_code') + + # 生年月日 + if len(self.record.birthday_era + self.record.birthday_year + self.record.birthday_month + self.record.birthday_day) > 0: + set_clauses.append('birthday_era = :birthday_era') + set_clauses.append('birthday_year = :birthday_year') + set_clauses.append('birthday_month = :birthday_month') + set_clauses.append('birthday_day = :birthday_day') + set_clauses.append('birthday = :birth_day') + + # 出身都道府県コード + if len(self.record.home_town_code) > 0: + set_clauses.append('hometown_cd = :home_town_code') + + # 医師会コード + if len(self.record.medassoci_code) > 0: + set_clauses.append('dr_circle_cd = :medassoci_code') + + # 卒年 + if len(self.record.grad_yearera + self.record.grad_year) > 0: + set_clauses.append('grad_year = :grad_year') + set_clauses.append('grad_era = :grad_yearera') + set_clauses.append('grad_y = :grad_y') + + # 出身校コード + if len(self.record.graduniv_code) > 0: + set_clauses.append('alma_cd = :graduniv_code') + + # 出身校学部識別コード + if len(self.record.graduniv_dept_code) > 0: + set_clauses.append('depart_disc_cd = :graduniv_dept_code') + + # 登録年 + if len(self.record.drda_yera + self.record.drday_year) > 0: + set_clauses.append('drday_era = :drda_yera') + set_clauses.append('drday_year = :drday_year') + set_clauses.append('drday_y = :drday_y') + + # 住所不明 + if len(self.record.dr_addr_lost_code) > 0: + set_clauses.append('addr_unknown_reason_cd = :dr_addr_lost_code') + + # 住所 + # 集合項目のいずれかに入力がある場合に更新 + if sum(len(item) for item in self.record.address_aggregation_items) > 0: + set_clauses.append('home_addr_kana = :dr_addr_kana') + set_clauses.append('home_addr = :dr_addr') + set_clauses.append('home_postal_number = :dr_zip_code') + set_clauses.append('addr_village_cd = :addr_village_cd') + set_clauses.append('prefc_cd = :pref_code') + set_clauses.append('city_cd = :city_code') + set_clauses.append('addr_display_number = :dr_addr_num') + set_clauses.append('addr_cnt_kana = :addr_cnt_kana') + set_clauses.append('addr_cnt = :addr_cnt') + + # 自宅電話番号 + if len(self.record.dr_tel) > 0: + set_clauses.append('home_phone_number = :dr_tel') + + # 利用停止区分 + if len(self.record.use_stop_flag) > 0: + set_clauses.append('use_stop_div = :use_stop_flag') + + # 利用停止理由 + if len(self.record.use_stopc_ode) > 0: + set_clauses.append('use_stop_reason_cd = :use_stopc_ode') + + # 利用停止登録年月日 + if len(self.record.cre_stop_date) > 0: + set_clauses.append('use_stop_regist_ymd = :cre_stop_date') + + # 利用停止解除年月日 + if len(self.record.release_date) > 0: + set_clauses.append('use_stop_cancel_ymd = :release_date') + + # 開勤区分 + if len(self.record.pract_class_code) > 0: + set_clauses.append('estab_div_cd = :pract_class_code') + + # 開業年 + if len(self.record.pract_yearera + self.record.pract_year) > 0: + set_clauses.append('estab_era = :pract_yearera') + set_clauses.append('estab_year = :pract_year') + set_clauses.append('estab_y = :estab_y') + + # 一括登録フラグ + if len(self.record.bskregst_flag) > 0: + set_clauses.append('lump_regist_flg = :bskregst_flag') + + return set_clauses + + def __make_delete_insert_trt_query(self): + # 診療科目(集合項目)のいずれかに入力がある場合 + if sum(len(item) for item in self.record.medsbj_code_items) == 0: + return + + # 削除 + self.queries.append(self.PHYSICAL_DELETE_QUERY_TRT) + + # @マークの場合は、登録しない + if self.record.medsbj_code1 == '@': + return + + # 登録 + for num, m_code in enumerate(self.record.medsbj_code_items, start=1): + if len(m_code) > 0: + insert_trt_query = self.INSERT_QUERY_TRT.format( + trt_course_code=f':medsbj_code{num}', + trt_sequence=num + ) + self.queries.append(insert_trt_query) + + return + + def __set_era(self): + # 西暦の取得 + + # 生年月日(西暦) + western_year: str = "" + if self.record.birthday_era != "@" and len(self.record.birthday_era) > 0 and len(self.record.birthday_year) > 0: + self.query_parameter['era_cd'] = self.record.birthday_era + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + western_year = str(int(record_year[0]['year']) + int(self.record.birthday_year)) + + # 生年月日の設定 + self.query_parameter['birth_day'] = self.__set_birthday(western_year) + + # 開業年(西暦) + if self.record.pract_yearera != "@" and len(self.record.pract_yearera) > 0 and len(self.record.pract_year) > 0: + self.query_parameter['era_cd'] = self.record.pract_yearera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['estab_y'] = str(int(record_year[0]['year']) + int(self.record.pract_year)) + + # 卒業年(西暦) + if self.record.grad_yearera != "@" and len(self.record.grad_yearera) > 0 and len(self.record.grad_year) > 0: + self.query_parameter['era_cd'] = self.record.grad_yearera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['grad_y'] = str(int(record_year[0]['year']) + int(self.record.grad_year)) + + # 登録年(西暦) + if self.record.drda_yera != "@" and len(self.record.drda_yera) > 0 and len(self.record.drday_year) > 0: + self.query_parameter['era_cd'] = self.record.drda_yera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['drday_y'] = str(int(record_year[0]['year']) + int(self.record.drday_year)) + + return + + def __set_birthday(self, western_year: str = ""): + # 生年月日を設定 + + # 年(西暦)、月、日を連結 + birth_day = ''.join([western_year, self.record.birthday_month, self.record.birthday_day]) + + # 年(西暦)、月、日が全て揃っている場合 + if len(birth_day) == 8: + return birth_day + + # 西暦が空の場合、先頭に半角スペース4つで連結 + if len(western_year) == 0 and len(self.record.birthday_month) > 0 and len(self.record.birthday_day) > 0: + return f' {self.record.birthday_month}{self.record.birthday_day}' + + # 月日も空の場合、生年月日は空 + return '' + + def __set_clearing_item(self): + # 削除予定理由 + if self.record.drdel_code == '@': + self.query_parameter['drdel_code'] = None + # 重複時相手先コード + if self.record.reptdr_id == '@': + self.query_parameter['opp_dup_code'] = None + # 生年月日 + if self.record.birthday_era == '@': + self.query_parameter['birthday_era'] = None + self.query_parameter['birthday_year'] = None + self.query_parameter['birthday_month'] = None + self.query_parameter['birthday_day'] = None + self.query_parameter['birth_day'] = None + # 卒年 + if self.record.grad_yearera == '@': + self.query_parameter['grad_yearera'] = None + self.query_parameter['grad_year'] = None + self.query_parameter['grad_y'] = None + # 登録年 + if self.record.drda_yera == '@': + self.query_parameter['drda_yera'] = None + self.query_parameter['drday_year'] = None + self.query_parameter['drday_y'] = None + # 住所不明 + if self.record.dr_addr_lost_code == '@': + self.query_parameter['dr_addr_lost_code'] = None + # 自宅電話番号 + if self.record.dr_tel == '@': + self.query_parameter['dr_tel'] = None + # 利用停止区分 + if self.record.use_stop_flag == '@': + self.query_parameter['use_stop_flag'] = None + # 利用停止理由 + if self.record.use_stopc_ode == '@': + self.query_parameter['use_stopc_ode'] = None + # 利用停止登録年月日 + if self.record.cre_stop_date == '@': + self.query_parameter['cre_stop_date'] = None + # 利用停止解除年月日 + if self.record.release_date == '@': + self.query_parameter['release_date'] = None + # 開業年 + if self.record.pract_yearera == '@': + self.query_parameter['pract_yearera'] = None + self.query_parameter['pract_year'] = None + self.query_parameter['estab_y'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py new file mode 100644 index 00000000..51ee1c63 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr_sosiety import ComDrSosiety + + +class ComDrSosietyMapper(UltmarcTableMapper): + """レイアウト区分521: COM_所属学会 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr_sosiety + ( + sosiety_cd, + dcf_pcf_dr_cd, + sosiety_f, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :sosiety_cd, + :dcf_pcf_dr_cd, + :sosiety_f, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_dr_sosiety + SET + sosiety_f = :sosiety_f, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』SQL + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + record: ComDrSosiety + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDrSosiety) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』 + if self.record.maint_flag == 'B' and self.record.cont_flag == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py new file mode 100644 index 00000000..fc47b278 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -0,0 +1,281 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace + + +class ComDrWrkplaceMapper(UltmarcTableMapper): + """レイアウト区分502:COM_医師勤務先 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + """ + # COM_所属部課から所属部科カナと所属部科名を取得するSQL + GET_NAME_FROM_COM_BLNG_SEC_QUERY = """\ + SELECT + blng_sec_kana, + blng_sec_name + FROM + src05.com_blng_sec + WHERE + blng_sec_cd = :sectcode + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr_wrkplace ( + 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, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :full_hp_code, + :full_dcfdr_code, + :sectcode, + :postcode, + :identitycode, + :syor_date, + :sectname_kana, + :sectname, + :notdm_flg, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_dr_wrkplace + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + DCF_PCF_DR_CD= :full_dcfdr_code + AND DCF_DSF_INST_CD = :full_hp_code + """ + + # 更新・削除の場合に該当のデータを履歴テーブルに退避するSQL + TO_HISTORY_QUERY = """\ + INSERT INTO src05.com_dr_wrkplace_his ( + 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, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + SELECT + dcf_dsf_inst_cd, + dcf_pcf_dr_cd, + ( + CASE + WHEN blng_sec_cd = '' THEN '9999' + ELSE blng_sec_cd + END + ) AS blng_sec_cd, + ( + CASE + WHEN post_cd = '' THEN '999' + ELSE post_cd + END + ) AS post_cd, + ( + CASE + WHEN identity_cd = '' THEN '999' + ELSE identity_cd + END + ) AS identity_cd, + DATE_FORMAT(aply_start_ymd, '%Y%m%d'), + blng_sec_name_kana, + blng_sec_name, + notdm_flg, + ( + CASE + WHEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') > DATE_FORMAT(DATE_SUB(:syor_date, INTERVAL 1 DAY), '%Y%m%d') THEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') + ELSE DATE_FORMAT(DATE_SUB(:syor_date, INTERVAL 1 DAY), '%Y%m%d') + END + ) AS aply_end_ymd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + FROM + src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + AND aply_start_ymd < :syor_date + """ + + # 退職レコードの場合、物理削除するSQL + PHYSICAL_DELETE_FOR_RETIREMENT_QUERY = """\ + DELETE FROM src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + """ + + record: ComDrWrkplace + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDrWrkplace) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 所属部科を取得し、所属部科カナと所属部科名を設定する + self.__set_sect_name_and_sect_name_kana() + # 追加/更新クエリを生成 + # 履歴へのレコード登録もあるため、リストで返る + self.queries = self.__make_queries() + return + + def __set_sect_name_and_sect_name_kana(self): + # 所属部科を取得し、所属部科カナと所属部科名を設定する + com_blng_sec_records = self.db.execute_select(self.GET_NAME_FROM_COM_BLNG_SEC_QUERY, self.query_parameter) + if len(com_blng_sec_records) == 0: + return + # 必ず1件 + com_blng_sec_record = com_blng_sec_records[0] + if com_blng_sec_record['blng_sec_kana'] != '' and com_blng_sec_record['blng_sec_kana'] is not None: + self.record.sectname_kana = com_blng_sec_record['blng_sec_kana'] + self.query_parameter['sectname_kana'] = com_blng_sec_record['blng_sec_kana'] + + if com_blng_sec_record['blng_sec_name'] != '' and com_blng_sec_record['blng_sec_name'] is not None: + self.record.sectname = com_blng_sec_record['blng_sec_name'] + self.query_parameter['sectname'] = com_blng_sec_record['blng_sec_name'] + + def __make_queries(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return [self.INSERT_QUERY] + + # 存在する場合はUpdate + # 予備/退職異動区分が1(削除:退職)の場合、退職済みのレコードとして処理 + if self.record.drretflag == '1': + # 履歴への移動と、退職レコードの物理削除 + return [self.TO_HISTORY_QUERY, self.PHYSICAL_DELETE_FOR_RETIREMENT_QUERY] + + # 履歴への移動+更新クエリ生成 + return self.__make_update_query() + + def __make_update_query(self): + make_history_query = None + # 履歴レコード作成判断となる、UPDATE SET句を作成 + set_clauses_with_historical = self.__make_update_columns_with_historical() + # 履歴レコード作成判断とならない、UPDATE SET句 + set_clause_without_historical = [] + # DM不可フラグの値をセット + # 履歴レコード作成判断とならないため、後から設定 + if self.record.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 + + update_columns = ','.join(set_clauses_with_historical + set_clause_without_historical) + if len(update_columns) == 0: + update_query = None + else: + # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + + return [make_history_query, update_query] + + def __make_update_columns_with_historical(self): + # 履歴レコードの作成有無を判断するカラムの更新設定 + # DM不可フラグは、履歴レコードの作成判断に使わないため、この関数の外で判定する + set_clauses = [] + # 役職コード + if self.record.postcode != '': + set_clauses.append('post_cd = :postcode') + # 大学順位 + if self.record.identitycode != '': + set_clauses.append('identity_cd = :identitycode') + # 所属部科(集合項目) + if self.record.sectcode != '': + # 所属部科コード + set_clauses.append('blng_sec_cd = :sectcode') + # 所属部科(カナ) + set_clauses.append(f'blng_sec_name_kana = :sectname_kana') + # 所属部科(漢字) + set_clauses.append(f'blng_sec_name = :sectname') + + # 何かしら更新がある場合、適用開始日をセットする + if len(set_clauses) != 0: + # 処理日はパラメータに設定済み + set_clauses.append("aply_start_ymd = DATE_FORMAT(:syor_date, '%Y%m%d')") + + return set_clauses + + def __set_clearing_item(self): + + # 役職コード + if self.record.postcode == '@': + # NOT NULLのため、空文字をセット + self.query_parameter['postcode'] = '' + # 大学順位 + if self.record.identitycode == '@': + # NOT NULLのため、空文字をセット + self.query_parameter['identitycode'] = '' + # DM不可フラグ + if self.record.notdm_flg == '@': + self.query_parameter['notdm_flg'] = None + + # 以下、実際には項目のクリアが発生しない為不要なロジックだが、現行踏襲の為残しておく + # 所属部科コード + if self.record.sectcode == '@': + # NOT NULLのため、固定の所属部科コードをセット + self.query_parameter['sectcode'] = '9999' + # 所属部科(カナ) + if self.record.sectname_kana == '@': + self.query_parameter['sectname_kana'] = None + # 所属部科(漢字) + # 全角の項目なので、修正項目値として全角@が連携される + if self.record.sectname == '@': + self.query_parameter['sectname'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py new file mode 100644 index 00000000..089ef73d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -0,0 +1,95 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + +from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip + + +class ComForfrontMedEquipMapper(UltmarcTableMapper): + """レイアウト区分022: COM_先端医療機器 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_forfront_med_equip + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_forfront_med_equip + ( + forfront_med_equip_cd, + forfront_med_equip_name, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hi_medicmach_code, + :hi_medicmach_name, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_forfront_med_equip + SET + forfront_med_equip_name = :hi_medicmach_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 削除年月日 ← システム日付 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_forfront_med_equip + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + record: ComForfrontMedEquip + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComForfrontMedEquip) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py new file mode 100644 index 00000000..e0ffbaae --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_hamtec import ComHamtec + + +class ComHamtecMapper(UltmarcTableMapper): + """レイアウト区分021: COM_高度先進医療 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_hamtec + WHERE + hamtec_cd = :hamtec_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_hamtec + ( + hamtec_cd, + hamtec_div, + hamtec_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hamtec_cd, + :hamtec_div, + :hamtec_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_hamtec + SET + hamtec_div = :hamtec_div, + hamtec_name = :hamtec_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hamtec_cd = :hamtec_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_hamtec + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hamtec_cd = :hamtec_cd + """ + record: ComHamtec + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComHamtec) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py new file mode 100644 index 00000000..a5e3bbcd --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_hp_assrt import ComHpAssrt + + +class ComHpAssrtMapper(UltmarcTableMapper): + """レイアウト区分002: COM_病院種別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_hp_assrt + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_hp_assrt + ( + hp_assrt_cd, + hp_assrt_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hp_assrt_cd, + :hp_assrt_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_hp_assrt + SET + hp_assrt_name = :hp_assrt_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_hp_assrt + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + record: ComHpAssrt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComHpAssrt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py new file mode 100644 index 00000000..2954527e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -0,0 +1,1275 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst_att import ComInstAtt + + +class ComInstAttMapper(UltmarcTableMapper): + """レイアウト区分111: COM_施設属性 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst_att + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_inst_att + ( + dcf_dsf_inst_cd, + dpc_flag, + dpc_specday, + dpc_cancelday, + predpc_flag, + predpc_specday, + predpc_cancelday, + cancer_flag, + cancer_specday, + cancer_cancelday, + funchpflag, + funchpokdate, + funchpcandate, + areasuphpflag, + areasuphpintrate, + areasuphpokdate, + areasuphpcandate, + acuthpaddflag, + acuthpaddokdate, + acuthpaddcandate, + genadmisiionflag, + genadmisiionfokdate, + genadmisiionfcandate, + assistanceflag, + assistanceokdate, + assistancecandate, + diagnosistreatment_flag, + diagnosistreatment_specday, + diagnosistreatment_cancelday, + safety_flag, + safety_specday, + safety_cancelday, + highrisk_flag, + highrisk_specday, + highrisk_cancelday, + infantandholiday_flag, + infantandholiday_specday, + infantandholiday_cancelday, + ophpflag, + ophpokdate, + ophpcandate, + critical_flag, + critical_code01, + critical_code02, + critical_code03, + critical_code04, + critical_code05, + critical_code06, + critical_code07, + critical_code08, + critical_code09, + critical_code10, + critical_code11, + critical_code12, + critical_code13, + critical_code14, + critical_code15, + critical_code16, + critical_code17, + critical_code18, + critical_code19, + critical_code20, + drgmgthpflag, + drgmgthpokdate, + drgmgthpcandate, + imagediagnosis_flag, + imagediagnosis_specifiedday, + imagediagnosis_cancelday, + chemotherapy_flag, + chemotherapy_specday, + chemotherapy_cancelday, + rehabilitation_flag, + rehabilitation_code01, + rehabilitation_code02, + rehabilitation_code03, + rehabilitation_code04, + rehabilitation_code05, + rehabilitation_code06, + rehabilitation_code07, + rehabilitation_code08, + rehabilitation_code09, + rehabilitation_code10, + anesthetizingmanage_flag, + anesthetizingmanage_specday, + anesthetizingmanage_cancelday, + homerecuperation_flag, + homerecuperation_specday, + homerecuperation_cancelday, + synthesiswhenstaying_flag, + synthesiswhenstaying_specday, + synthesiswhenstaying_cancelday, + homelateflag, + homelateokday, + homelatecanday, + caremixkind, + fullmoveflag, + resthpflag, + resthpcarekind, + resthpbednum, + resthpokdate, + resthpcandate, + resthpcarenrskind, + resthpcarebednum, + resthpcareokdate, + resthpcarecandate, + resthpsbednum, + nrmhpflag, + nrmhpcarekind, + nrmhpbedtotalnum, + menthpflag, + menthpcarekind, + menthpbednum, + tubhpflag, + tubhpcarekind, + tubhpbednum, + infhpflag, + infhpflag1, + infhpflag2, + infhpbedflag, + infhpbednum, + hospiceflag, + hospicebednum, + hospiceokdate, + hospicecandate, + hpfuncestflag, + hpfuncestkind, + hpfuncestokdate, + hpfuncestcandate, + clolyhpkind, + clolyhpokdate, + clolyhpcandate, + clhpkind, + clhpokdate, + clhpcandate, + cldephpkind, + cldephpokdate, + cldephpcandate, + disasthpflag, + d1emerhpflag, + d2emerhpflag, + d3emerhpflag, + emergencyclinic, + trialcoreflag, + trialcore_div, + trialcoreokdate, + trialcorecandate, + dementiaflag, + dementiaokdate, + dementiacandate, + sphealth_exploration, + sphealth_guidance, + hiadhpflag, + hiadhpcode1, + hiadhpkind1, + hiadhpcode2, + hiadhpkind2, + hiadhpcode3, + hiadhpkind3, + hiadhpcode4, + hiadhpkind4, + hiadhpcode5, + hiadhpkind5, + hiadhpcode6, + hiadhpkind6, + hiadhpcode7, + hiadhpkind7, + hiadhpcode8, + hiadhpkind8, + hiadhpcode9, + hiadhpkind9, + hiadhpcode10, + hiadhpkind10, + hiadhpcode11, + hiadhpkind11, + hiadhpcode12, + hiadhpkind12, + hiadhpcode13, + hiadhpkind13, + hiadhpcode14, + hiadhpkind14, + hiadhpcode15, + hiadhpkind15, + hiadhpcode16, + hiadhpkind16, + hiadhpcode17, + hiadhpkind17, + hiadhpcode18, + hiadhpkind18, + hiadhpcode19, + hiadhpkind19, + hiadhpcode20, + hiadhpkind20, + hiadhpcode21, + hiadhpkind21, + hiadhpcode22, + hiadhpkind22, + hiadhpcode23, + hiadhpkind23, + hiadhpcode24, + hiadhpkind24, + hiadhpcode25, + hiadhpkind25, + hiadhpcode26, + hiadhpkind26, + hiadhpcode27, + hiadhpkind27, + hiadhpcode28, + hiadhpkind28, + hiadhpcode29, + hiadhpkind29, + hiadhpcode30, + hiadhpkind30, + hiadhpcode31, + hiadhpkind31, + hiadhpcode32, + hiadhpkind32, + hiadhpcode33, + hiadhpkind33, + hiadhpcode34, + hiadhpkind34, + hiadhpcode35, + hiadhpkind35, + hiadhpcode36, + hiadhpkind36, + hiadhpcode37, + hiadhpkind37, + hiadhpcode38, + hiadhpkind38, + hiadhpcode39, + hiadhpkind39, + hiadhpcode40, + hiadhpkind40, + hitechhpflag, + hitechhpkind1, + hitechhpkind2, + hitechhpkind3, + hitechhpkind4, + hitechhpkind5, + hitechhpkind6, + hitechhpkind7, + hitechhpkind8, + hitechhpkind9, + hitechhpkind10, + hitechhpkind11, + hitechhpkind12, + hitechhpkind13, + hitechhpkind14, + hitechhpkind15, + hitechhpkind16, + hitechhpkind17, + hitechhpkind18, + hitechhpkind19, + hitechhpkind20, + policymedical_flag, + policymedical_code01, + policymedical_content01, + policymedical_code02, + policymedical_content02, + policymedical_code03, + policymedical_content03, + policymedical_code04, + policymedical_content04, + policymedical_code05, + policymedical_content05, + policymedical_code06, + policymedical_content06, + policymedical_code07, + policymedical_content07, + policymedical_code08, + policymedical_content08, + policymedical_code09, + policymedical_content09, + policymedical_code10, + policymedical_content10, + policymedical_code11, + policymedical_content11, + policymedical_code12, + policymedical_content12, + policymedical_code13, + policymedical_content13, + policymedical_code14, + policymedical_content14, + policymedical_code15, + policymedical_content15, + policymedical_code16, + policymedical_content16, + policymedical_code17, + policymedical_content17, + policymedical_code18, + policymedical_content18, + policymedical_code19, + policymedical_content19, + policymedical_code20, + policymedical_content20, + visitcarestflag, + visitcarestation_id, + visitcarestation_code, + visitcarestation_yobi, + opendate, + regist_ymd, + update_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :dpc_flag, + :dpc_spec_day, + :dpc_cancel_day, + :predpc_flag, + :predpc_spec_day, + :predpc_cancel_day, + :cancer_flag, + :cancer_spec_day, + :cancer_cancel_day, + :funchp_flag, + :funchp_ok_date, + :funchp_can_date, + :areasuphp_flag, + :areasuphp_intrate, + :areasuphp_ok_date, + :areasuphp_can_date, + :acuthp_add_flag, + :acuthp_add_ok_date, + :acuthp_add_can_date, + :genadmisiion_flag, + :genadmisiion_ok_date, + :genadmisiion_can_date, + :assistance_flag, + :assistance_ok_date, + :assistance_can_date, + :diagnosis_treatment_flag, + :diagnosis_treatment_spec_day, + :diagnosis_treatment_cancel_day, + :safety_flag, + :safety_spec_day, + :safety_cancel_day, + :highrisk_flag, + :highrisk_spec_day, + :highrisk_cancel_day, + :infant_and_holiday_flag, + :infant_and_holiday_spec_day, + :infant_and_holiday_cancel_day, + :ophp_flag, + :ophpok_date, + :ophpcan_date, + :critical_flag, + :critical_code01, + :critical_code02, + :critical_code03, + :critical_code04, + :critical_code05, + :critical_code06, + :critical_code07, + :critical_code08, + :critical_code09, + :critical_code10, + :critical_code11, + :critical_code12, + :critical_code13, + :critical_code14, + :critical_code15, + :critical_code16, + :critical_code17, + :critical_code18, + :critical_code19, + :critical_code20, + :drgmgthp_flag, + :drgmgthp_ok_date, + :drgmgthp_can_date, + :image_diagnosis_flag, + :image_diagnosis_specified_day, + :image_diagnosis_cancel_day, + :chemotherapy_flag, + :chemotherapy_spec_day, + :chemotherapy_cancel_day, + :rehabilitation_flag, + :rehabilitation_code01, + :rehabilitation_code02, + :rehabilitation_code03, + :rehabilitation_code04, + :rehabilitation_code05, + :rehabilitation_code06, + :rehabilitation_code07, + :rehabilitation_code08, + :rehabilitation_code09, + :rehabilitation_code10, + :anesthetizing_manage_flag, + :anesthetizing_manage_spec_day, + :anesthetizing_manage_can_day, + :home_recuperation_flag, + :home_recuperation_spec_day, + :home_recuperation_cancel_day, + :synthesis_when_staying_flag, + :synthesis_when_staying_spec_day, + :synthesis_when_staying_can_day, + :home_late_flag, + :home_late_ok_day, + :home_late_can_day, + :caremix_kind, + :fullmove_flag, + :resthp_flag, + :resthp_care_kind, + :resthp_bed_num, + :resthp_ok_date, + :resthp_can_date, + :resthp_care_nrs_kind, + :resthp_care_bed_num, + :resthp_care_ok_date, + :resthp_care_can_date, + :resthp_sbed_num, + :nrmhp_flag, + :nrmhp_care_kind, + :nrmhp_bed_total_num, + :menthp_flag, + :menthp_care_kind, + :menthp_bed_num, + :tubhp_flag, + :tubhp_care_kind, + :tubhp_bed_num, + :infhp_flag, + :infhp_flag1, + :infhp_flag2, + :infhp_bed_flag, + :infhp_bed_num, + :hospice_flag, + :hospice_bed_num, + :hospice_ok_date, + :hospice_can_date, + :hpfunce_st_flag, + :hpfunce_st_kind, + :hpfunce_st_ok_date, + :hpfunce_st_can_date, + :clolyhp_kind, + :clolyhp_ok_date, + :clolyhp_can_date, + :clhp_kind, + :clhp_ok_date, + :clhp_can_date, + :cldephp_kind, + :cldephp_ok_date, + :cldephp_can_date, + :disasthp_flag, + :d1emerhp_flag, + :d2emerhp_flag, + :d3emerhp_flag, + :emergency_clinic, + :trial_core_flag, + :trial_core_div, + :trial_core_ok_date, + :trial_core_can_date, + :dementia_flag, + :dementia_okd_ate, + :dementia_can_date, + :sphealth_exploration, + :sphealth_guidance, + :hiadhp_flag, + :hiadhpcode1, + :hiadhpkind1, + :hiadhpcode2, + :hiadhpkind2, + :hiadhpcode3, + :hiadhpkind3, + :hiadhpcode4, + :hiadhpkind4, + :hiadhpcode5, + :hiadhpkind5, + :hiadhpcode6, + :hiadhpkind6, + :hiadhpcode7, + :hiadhpkind7, + :hiadhpcode8, + :hiadhpkind8, + :hiadhpcode9, + :hiadhpkind9, + :hiadhpcode10, + :hiadhpkind10, + :hiadhpcode11, + :hiadhpkind11, + :hiadhpcode12, + :hiadhpkind12, + :hiadhpcode13, + :hiadhpkind13, + :hiadhpcode14, + :hiadhpkind14, + :hiadhpcode15, + :hiadhpkind15, + :hiadhpcode16, + :hiadhpkind16, + :hiadhpcode17, + :hiadhpkind17, + :hiadhpcode18, + :hiadhpkind18, + :hiadhpcode19, + :hiadhpkind19, + :hiadhpcode20, + :hiadhpkind20, + :hiadhpcode21, + :hiadhpkind21, + :hiadhpcode22, + :hiadhpkind22, + :hiadhpcode23, + :hiadhpkind23, + :hiadhpcode24, + :hiadhpkind24, + :hiadhpcode25, + :hiadhpkind25, + :hiadhpcode26, + :hiadhpkind26, + :hiadhpcode27, + :hiadhpkind27, + :hiadhpcode28, + :hiadhpkind28, + :hiadhpcode29, + :hiadhpkind29, + :hiadhpcode30, + :hiadhpkind30, + :hiadhpcode31, + :hiadhpkind31, + :hiadhpcode32, + :hiadhpkind32, + :hiadhpcode33, + :hiadhpkind33, + :hiadhpcode34, + :hiadhpkind34, + :hiadhpcode35, + :hiadhpkind35, + :hiadhpcode36, + :hiadhpkind36, + :hiadhpcode37, + :hiadhpkind37, + :hiadhpcode38, + :hiadhpkind38, + :hiadhpcode39, + :hiadhpkind39, + :hiadhpcode40, + :hiadhpkind40, + :hitechhp_flag, + :hitechhpkind1, + :hitechhpkind2, + :hitechhpkind3, + :hitechhpkind4, + :hitechhpkind5, + :hitechhpkind6, + :hitechhpkind7, + :hitechhpkind8, + :hitechhpkind9, + :hitechhpkind10, + :hitechhpkind11, + :hitechhpkind12, + :hitechhpkind13, + :hitechhpkind14, + :hitechhpkind15, + :hitechhpkind16, + :hitechhpkind17, + :hitechhpkind18, + :hitechhpkind19, + :hitechhpkind20, + :policy_medical_flag, + :policymedical_code01, + :policymedical_content01, + :policymedical_code02, + :policymedical_content02, + :policymedical_code03, + :policymedical_content03, + :policymedical_code04, + :policymedical_content04, + :policymedical_code05, + :policymedical_content05, + :policymedical_code06, + :policymedical_content06, + :policymedical_code07, + :policymedical_content07, + :policymedical_code08, + :policymedical_content08, + :policymedical_code09, + :policymedical_content09, + :policymedical_code10, + :policymedical_content10, + :policymedical_code11, + :policymedical_content11, + :policymedical_code12, + :policymedical_content12, + :policymedical_code13, + :policymedical_content13, + :policymedical_code14, + :policymedical_content14, + :policymedical_code15, + :policymedical_content15, + :policymedical_code16, + :policymedical_content16, + :policymedical_code17, + :policymedical_content17, + :policymedical_code18, + :policymedical_content18, + :policymedical_code19, + :policymedical_content19, + :policymedical_code20, + :policymedical_content20, + :visitcarest_flag, + :visitcarestation_id, + :visitcarestation_code, + :visitcarestation_yobi, + :open_date, + :execute_date_str_ymd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_inst_att + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_inst_att + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + record: ComInstAtt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInstAtt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.__make_upsert_query() + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 存在する場合はUpdate + self.queries.append(self.__make_update_query()) + return + + def __make_update_query(self): + set_clauses = [] + # DPC対象病院 + if len(self.record.dpc_flag) > 0: + set_clauses.append('dpc_flag = :dpc_flag') + set_clauses.append('dpc_specday = :dpc_spec_day') + set_clauses.append('dpc_cancelday = :dpc_cancel_day') + + # DPC準備病院 + if len(self.record.predpc_flag) > 0: + set_clauses.append('predpc_flag = :predpc_flag') + set_clauses.append('predpc_specday = :predpc_spec_day') + set_clauses.append('predpc_cancelday = :predpc_cancel_day') + + # がん診療連携拠点病院 + if len(self.record.cancer_flag) > 0: + set_clauses.append('cancer_flag = :cancer_flag') + set_clauses.append('cancer_specday = :cancer_spec_day') + set_clauses.append('cancer_cancelday = :cancer_cancel_day') + + # 特定機能病院 + if len(self.record.funchp_flag) > 0: + set_clauses.append('funchpflag = :funchp_flag') + set_clauses.append('funchpokdate = :funchp_ok_date') + set_clauses.append('funchpcandate = :funchp_can_date') + + # 地域医療支援病院 + if len(self.record.areasuphp_flag) > 0: + set_clauses.append('areasuphpflag = :areasuphp_flag') + set_clauses.append('areasuphpintrate = :areasuphp_intrate') + set_clauses.append('areasuphpokdate = :areasuphp_ok_date') + set_clauses.append('areasuphpcandate = :areasuphp_can_date') + + # 超急性期脳卒中加算 + if len(self.record.acuthp_add_flag) > 0: + set_clauses.append('acuthpaddflag = :acuthp_add_flag') + set_clauses.append('acuthpaddokdate = :acuthp_add_ok_date') + set_clauses.append('acuthpaddcandate = :acuthp_add_can_date') + + # 総合入院体制加算 + if len(self.record.genadmisiion_flag) > 0: + set_clauses.append('genadmisiionflag = :genadmisiion_flag') + set_clauses.append('genadmisiionfokdate = :genadmisiion_ok_date') + set_clauses.append('genadmisiionfcandate = :genadmisiion_can_date') + + # 医師事務作業補助体制加算 + if len(self.record.assistance_flag) > 0: + set_clauses.append('assistanceflag = :assistance_flag') + set_clauses.append('assistanceokdate = :assistance_ok_date') + set_clauses.append('assistancecandate = :assistance_can_date') + + # 診療録管理体制加算 + if len(self.record.diagnosis_treatment_flag) > 0: + set_clauses.append('diagnosistreatment_flag = :diagnosis_treatment_flag') + set_clauses.append('diagnosistreatment_specday = :diagnosis_treatment_spec_day') + set_clauses.append('diagnosistreatment_cancelday = :diagnosis_treatment_cancel_day') + + # 医療安全対策加算 + if len(self.record.safety_flag) > 0: + set_clauses.append('safety_flag = :safety_flag') + set_clauses.append('safety_specday = :safety_spec_day') + set_clauses.append('safety_cancelday = :safety_cancel_day') + + # 褥瘡ハイリスク患者ケア加算 + if len(self.record.highrisk_flag) > 0: + set_clauses.append('highrisk_flag = :highrisk_flag') + set_clauses.append('highrisk_specday = :highrisk_spec_day') + set_clauses.append('highrisk_cancelday = :highrisk_cancel_day') + + # 地域連携小児夜間・休日診療料 + if len(self.record.infant_and_holiday_flag) > 0: + set_clauses.append('infantandholiday_flag = :infant_and_holiday_flag') + set_clauses.append('infantandholiday_specday = :infant_and_holiday_spec_day') + set_clauses.append('infantandholiday_cancelday = :infant_and_holiday_cancel_day') + + # 開放型病院 + if len(self.record.ophp_flag) > 0: + set_clauses.append('ophpflag = :ophp_flag') + set_clauses.append('ophpokdate = :ophpok_date') + set_clauses.append('ophpcandate = :ophpcan_date') + + # 地域連携クリティカルパス + if len(self.record.critical_flag) > 0: + set_clauses.append('critical_flag = :critical_flag') + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name = f'critical_code{num}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') + + # 薬剤管理指導料 + if len(self.record.drgmgthp_flag) > 0: + set_clauses.append('drgmgthpflag = :drgmgthp_flag') + set_clauses.append('drgmgthpokdate = :drgmgthp_ok_date') + set_clauses.append('drgmgthpcandate = :drgmgthp_can_date') + + # 画像診断管理加算 + if len(self.record.image_diagnosis_flag) > 0: + set_clauses.append('imagediagnosis_flag = :image_diagnosis_flag') + set_clauses.append('imagediagnosis_specifiedday = :image_diagnosis_specified_day') + set_clauses.append('imagediagnosis_cancelday = :image_diagnosis_cancel_day') + + # 外来化学療法加算 + if len(self.record.chemotherapy_flag) > 0: + set_clauses.append('chemotherapy_flag = :chemotherapy_flag') + set_clauses.append('chemotherapy_specday = :chemotherapy_spec_day') + set_clauses.append('chemotherapy_cancelday = :chemotherapy_cancel_day') + + # 疾患別リハビリテーション料 + if len(self.record.rehabilitation_flag) > 0: + set_clauses.append('rehabilitation_flag = :rehabilitation_flag') + # 10個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 11): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name = f'rehabilitation_code{num}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') + + # 麻酔管理料 + if len(self.record.anesthetizing_manage_flag) > 0: + set_clauses.append('anesthetizingmanage_flag = :anesthetizing_manage_flag') + set_clauses.append('anesthetizingmanage_specday = :anesthetizing_manage_spec_day') + set_clauses.append('anesthetizingmanage_cancelday = :anesthetizing_manage_can_day') + + # 在宅療養支援病院・診療所 + if len(self.record.home_recuperation_flag) > 0: + set_clauses.append('homerecuperation_flag = :home_recuperation_flag') + set_clauses.append('homerecuperation_specday = :home_recuperation_spec_day') + set_clauses.append('homerecuperation_cancelday = :home_recuperation_cancel_day') + + # 在宅時医学総合管理料 + if len(self.record.synthesis_when_staying_flag) > 0: + set_clauses.append('synthesiswhenstaying_flag = :synthesis_when_staying_flag') + set_clauses.append('synthesiswhenstaying_specday = :synthesis_when_staying_spec_day') + set_clauses.append('synthesiswhenstaying_cancelday = :synthesis_when_staying_can_day') + + # 在宅末期医療総合診療料 + if len(self.record.home_late_flag) > 0: + set_clauses.append('homelateflag = :home_late_flag') + set_clauses.append('homelateokday = :home_late_ok_day') + set_clauses.append('homelatecanday = :home_late_can_day') + + # ケアミックス区分 + if len(self.record.caremix_kind) > 0: + set_clauses.append('caremixkind = :caremix_kind') + + # 完全型・移行型区分 + if len(self.record.fullmove_flag) > 0: + set_clauses.append('fullmoveflag = :fullmove_flag') + + # 療養型病床群 + if sum(len(item) for item in self.record.resthp_items) > 0: + # 医療型 + set_clauses.append('resthpflag = :resthp_flag') + set_clauses.append('resthpcarekind = :resthp_care_kind') + set_clauses.append('resthpbednum = :resthp_bed_num') + set_clauses.append('resthpokdate = :resthp_ok_date') + set_clauses.append('resthpcandate = :resthp_can_date') + # 介護型 + set_clauses.append('resthpcarenrskind = :resthp_care_nrs_kind') + set_clauses.append('resthpcarebednum = :resthp_care_bed_num') + set_clauses.append('resthpcareokdate = :resthp_care_ok_date') + set_clauses.append('resthpcarecandate = :resthp_care_can_date') + # 合計 + set_clauses.append('resthpsbednum = :resthp_sbed_num') + + # 一般病棟 + if len(self.record.nrmhp_flag) > 0: + set_clauses.append('nrmhpflag = :nrmhp_flag') + set_clauses.append('nrmhpcarekind = :nrmhp_care_kind') + set_clauses.append('nrmhpbedtotalnum = :nrmhp_bed_total_num') + + # 精神病棟 + if len(self.record.menthp_flag) > 0: + set_clauses.append('menthpflag = :menthp_flag') + set_clauses.append('menthpcarekind = :menthp_care_kind') + set_clauses.append('menthpbednum = :menthp_bed_num') + + # 結核病棟 + if len(self.record.tubhp_flag) > 0: + set_clauses.append('tubhpflag = :tubhp_flag') + set_clauses.append('tubhpcarekind = :tubhp_care_kind') + set_clauses.append('tubhpbednum = :tubhp_bed_num') + + # 感染症指定医療機関 + if len(self.record.infhp_flag) > 0: + set_clauses.append('infhpflag = :infhp_flag') + set_clauses.append('infhpflag1 = :infhp_flag1') + set_clauses.append('infhpflag2 = :infhp_flag2') + + # 感染症病床 + if len(self.record.infhp_bed_flag) > 0: + set_clauses.append('infhpbedflag = :infhp_bed_flag') + set_clauses.append('infhpbednum = :infhp_bed_num') + + # 緩和ケア病棟設置病院 + if len(self.record.hospice_flag) > 0: + set_clauses.append('hospiceflag = :hospice_flag') + set_clauses.append('hospicebednum = :hospice_bed_num') + set_clauses.append('hospiceokdate = :hospice_ok_date') + set_clauses.append('hospicecandate = :hospice_can_date') + + # 医療機能評価 + if len(self.record.hpfunce_st_flag) > 0: + set_clauses.append('hpfuncestflag = :hpfunce_st_flag') + set_clauses.append('hpfuncestkind = :hpfunce_st_kind') + set_clauses.append('hpfuncestokdate = :hpfunce_st_ok_date') + set_clauses.append('hpfuncestcandate = :hpfunce_st_can_date') + + # 臨床研修指定病院 + if sum(len(item) for item in self.record.cl_items) > 0: + # 基幹型病院1 + set_clauses.append('clolyhpkind = :clolyhp_kind') + set_clauses.append('clolyhpokdate = :clolyhp_ok_date') + set_clauses.append('clolyhpcandate = :clolyhp_can_date') + # 基幹型病院2(群指定) + set_clauses.append('clhpkind = :clhp_kind') + set_clauses.append('clhpokdate = :clhp_ok_date') + set_clauses.append('clhpcandate = :clhp_can_date') + # 協力型病院(群指定) + set_clauses.append('cldephpkind = :cldephp_kind') + set_clauses.append('cldephpokdate = :cldephp_ok_date') + set_clauses.append('cldephpcandate = :cldephp_can_date') + + # 災害拠点病院 + if len(self.record.disasthp_flag) > 0: + set_clauses.append('disasthpflag = :disasthp_flag') + + # 救急医療 + if len(self.record.d1emerhp_flag) > 0: + set_clauses.append('d1emerhpflag = :d1emerhp_flag') + set_clauses.append('d2emerhpflag = :d2emerhp_flag') + set_clauses.append('d3emerhpflag = :d3emerhp_flag') + + # 救急告示診療所 + if len(self.record.emergency_clinic) > 0: + set_clauses.append('emergencyclinic = :emergency_clinic') + + # 治験中核病院 + if len(self.record.trial_core_flag) > 0: + set_clauses.append('trialcoreflag = :trial_core_flag') + set_clauses.append('trialcore_div = :trial_core_div') + set_clauses.append('trialcoreokdate = :trial_core_ok_date') + set_clauses.append('trialcorecandate = :trial_core_can_date') + + # 認知症疾患医療センター + if len(self.record.dementia_flag) > 0: + set_clauses.append('dementiaflag = :dementia_flag') + set_clauses.append('dementiaokdate = :dementia_okd_ate') + set_clauses.append('dementiacandate = :dementia_can_date') + + # 特定健康診査実施機関 + if len(self.record.sphealth_exploration) > 0: + set_clauses.append('sphealth_exploration = :sphealth_exploration') + + # 特定保健指導実施機関 + if len(self.record.sphealth_guidance) > 0: + set_clauses.append('sphealth_guidance = :sphealth_guidance') + + # 先進医療実施医療機関 + if len(self.record.hiadhp_flag) > 0: + set_clauses.append('hiadhpflag = :hiadhp_flag') + # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 41): + setting_item_name_code = f'hiadhpcode{i}' + setting_item_name_kind = f'hiadhpkind{i}' + set_clauses.append(f'{setting_item_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_item_name_kind} = :{setting_item_name_kind}') + + # 先端医療実施医療機関 + if len(self.record.hitechhp_flag) > 0: + set_clauses.append('hitechhpflag = :hitechhp_flag') + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + setting_item_name = f'hitechhpkind{i}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') + + # 政策医療 + if len(self.record.policy_medical_flag) > 0: + set_clauses.append('policymedical_flag = :policy_medical_flag') + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name_code = f'policymedical_code{num}' + setting_item_name_content = f'policymedical_content{num}' + set_clauses.append(f'{setting_item_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_item_name_content} = :{setting_item_name_content}') + + # 訪問看護ステーション + if len(self.record.visitcarest_flag) > 0: + set_clauses.append('visitcarestflag = :visitcarest_flag') + set_clauses.append('visitcarestation_id = :visitcarestation_id') + set_clauses.append('visitcarestation_code = :visitcarestation_code') + set_clauses.append('visitcarestation_yobi = :visitcarestation_yobi') + + # 開設年月 + if len(self.record.open_date) > 0: + set_clauses.append('opendate = :open_date') + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query + + def __set_clearing_item(self): + # DPC対象病院 + if self.record.dpc_flag == '@': + self.query_parameter['dpc_flag'] = None + self.query_parameter['dpc_spec_day'] = None + self.query_parameter['dpc_cancel_day'] = None + # DPC準備病院 + if self.record.predpc_flag == '@': + self.query_parameter['predpc_flag'] = None + self.query_parameter['predpc_spec_day'] = None + self.query_parameter['predpc_cancel_day'] = None + # がん診療連携拠点病院 + if self.record.cancer_flag == '@': + self.query_parameter['cancer_flag'] = None + self.query_parameter['cancer_spec_day'] = None + self.query_parameter['cancer_cancel_day'] = None + # 特定機能病院 + if self.record.funchp_flag == '@': + self.query_parameter['funchp_flag'] = None + self.query_parameter['funchp_ok_date'] = None + self.query_parameter['funchp_can_date'] = None + # 地域医療支援病院 + if self.record.areasuphp_flag == '@': + self.query_parameter['areasuphp_flag'] = None + self.query_parameter['areasuphp_intrate'] = None + self.query_parameter['areasuphp_ok_date'] = None + self.query_parameter['areasuphp_can_date'] = None + # 超急性期脳卒中加算 + if self.record.acuthp_add_flag == '@': + self.query_parameter['acuthp_add_flag'] = None + self.query_parameter['acuthp_add_ok_date'] = None + self.query_parameter['acuthp_add_can_date'] = None + # 総合入院体制加算 + if self.record.genadmisiion_flag == '@': + self.query_parameter['genadmisiion_flag'] = None + self.query_parameter['genadmisiion_ok_date'] = None + self.query_parameter['genadmisiion_can_date'] = None + # 医師事務作業補助体制加算 + if self.record.assistance_flag == '@': + self.query_parameter['assistance_flag'] = None + self.query_parameter['assistance_ok_date'] = None + self.query_parameter['assistance_can_date'] = None + # 診療録管理体制加算 + if self.record.diagnosis_treatment_flag == '@': + self.query_parameter['diagnosis_treatment_flag'] = None + self.query_parameter['diagnosis_treatment_spec_day'] = None + self.query_parameter['diagnosis_treatment_cancel_day'] = None + # 医療安全対策加算 + if self.record.safety_flag == '@': + self.query_parameter['safety_flag'] = None + self.query_parameter['safety_spec_day'] = None + self.query_parameter['safety_cancel_day'] = None + # 褥瘡ハイリスク患者ケア加算 + if self.record.highrisk_flag == '@': + self.query_parameter['highrisk_flag'] = None + self.query_parameter['highrisk_spec_day'] = None + self.query_parameter['highrisk_cancel_day'] = None + # 地域連携小児夜間・休日診療料 + if self.record.infant_and_holiday_flag == '@': + self.query_parameter['infant_and_holiday_flag'] = None + self.query_parameter['infant_and_holiday_spec_day'] = None + self.query_parameter['infant_and_holiday_cancel_day'] = None + # 開放型病院 + if self.record.ophp_flag == '@': + self.query_parameter['ophp_flag'] = None + self.query_parameter['ophpok_date'] = None + self.query_parameter['ophpcan_date'] = None + + # 地域連携クリティカルパス + is_aggregate_item_clear = self.record.critical_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['critical_flag'] = None + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name = f'critical_code{num}' + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None + + # 薬剤管理指導料 + if self.record.drgmgthp_flag == '@': + self.query_parameter['drgmgthp_flag'] = None + self.query_parameter['drgmgthp_ok_date'] = None + self.query_parameter['drgmgthp_can_date'] = None + # 画像診断管理加算 + if self.record.image_diagnosis_flag == '@': + self.query_parameter['image_diagnosis_flag'] = None + self.query_parameter['image_diagnosis_specified_day'] = None + self.query_parameter['image_diagnosis_cancel_day'] = None + # 外来化学療法加算 + if self.record.chemotherapy_flag == '@': + self.query_parameter['chemotherapy_flag'] = None + self.query_parameter['chemotherapy_spec_day'] = None + self.query_parameter['chemotherapy_cancel_day'] = None + + # 疾患別リハビリテーション料 + is_aggregate_item_clear = self.record.rehabilitation_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['rehabilitation_flag'] = None + # 10個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 11): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name = f'rehabilitation_code{num}' + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None + + # 麻酔管理料 + if self.record.anesthetizing_manage_flag == '@': + self.query_parameter['anesthetizing_manage_flag'] = None + self.query_parameter['anesthetizing_manage_spec_day'] = None + self.query_parameter['anesthetizing_manage_can_day'] = None + # 在宅療養支援病院・診療所 + if self.record.home_recuperation_flag == '@': + self.query_parameter['home_recuperation_flag'] = None + self.query_parameter['home_recuperation_spec_day'] = None + self.query_parameter['home_recuperation_cancel_day'] = None + # 在宅時医学総合管理料 + if self.record.synthesis_when_staying_flag == '@': + self.query_parameter['synthesis_when_staying_flag'] = None + self.query_parameter['synthesis_when_staying_spec_day'] = None + self.query_parameter['synthesis_when_staying_can_day'] = None + # 在宅末期医療総合診療料 + if self.record.home_late_flag == '@': + self.query_parameter['home_late_flag'] = None + self.query_parameter['home_late_ok_day'] = None + self.query_parameter['home_late_can_day'] = None + # ケアミックス区分 + if self.record.caremix_kind == '@': + self.query_parameter['caremix_kind'] = None + # 完全型・移行型区分 + if self.record.fullmove_flag == '@': + self.query_parameter['fullmove_flag'] = None + # 療養型病床群 + if self.record.resthp_flag == '@': + # 医療型 + self.query_parameter['resthp_flag'] = None + self.query_parameter['resthp_care_kind'] = None + self.query_parameter['resthp_bed_num'] = None + self.query_parameter['resthp_ok_date'] = None + self.query_parameter['resthp_can_date'] = None + # 介護型 + self.query_parameter['resthp_care_nrs_kind'] = None + self.query_parameter['resthp_care_bed_num'] = None + self.query_parameter['resthp_care_ok_date'] = None + self.query_parameter['resthp_care_can_date'] = None + # 合計 + self.query_parameter['resthp_sbed_num'] = None + # 一般病棟 + if self.record.nrmhp_flag == '@': + self.query_parameter['nrmhp_flag'] = None + self.query_parameter['nrmhp_care_kind'] = None + self.query_parameter['nrmhp_bed_total_num'] = None + # 精神病棟 + if self.record.menthp_flag == '@': + self.query_parameter['menthp_flag'] = None + self.query_parameter['menthp_care_kind'] = None + self.query_parameter['menthp_bed_num'] = None + # 結核病棟 + if self.record.tubhp_flag == '@': + self.query_parameter['tubhp_flag'] = None + self.query_parameter['tubhp_care_kind'] = None + self.query_parameter['tubhp_bed_num'] = None + # 感染症指定医療機関 + if self.record.infhp_flag == '@': + self.query_parameter['infhp_flag'] = None + self.query_parameter['infhp_flag1'] = None + self.query_parameter['infhp_flag2'] = None + # 感染症病床 + if self.record.infhp_bed_flag == '@': + self.query_parameter['infhp_bed_flag'] = None + self.query_parameter['infhp_bed_num'] = None + # 緩和ケア病棟設置病院 + if self.record.hospice_flag == '@': + self.query_parameter['hospice_flag'] = None + self.query_parameter['hospice_bed_num'] = None + self.query_parameter['hospice_ok_date'] = None + self.query_parameter['hospice_can_date'] = None + # 医療機能評価 + if self.record.hpfunce_st_flag == '@': + self.query_parameter['hpfunce_st_flag'] = None + self.query_parameter['hpfunce_st_kind'] = None + self.query_parameter['hpfunce_st_ok_date'] = None + self.query_parameter['hpfunce_st_can_date'] = None + # 臨床研修指定病院 + if self.record.clolyhp_kind == '@': + # 基幹型病院1 + self.query_parameter['clolyhp_kind'] = None + self.query_parameter['clolyhp_ok_date'] = None + self.query_parameter['clolyhp_can_date'] = None + # 基幹型病院2(群指定) + self.query_parameter['clhp_kind'] = None + self.query_parameter['clhp_ok_date'] = None + self.query_parameter['clhp_can_date'] = None + # 協力型病院(群指定) + self.query_parameter['cldephp_kind'] = None + self.query_parameter['cldephp_ok_date'] = None + self.query_parameter['cldephp_can_date'] = None + # 災害拠点病院 + if self.record.disasthp_flag == '@': + self.query_parameter['disasthp_flag'] = None + # 救急医療 + if self.record.d1emerhp_flag == '@': + self.query_parameter['d1emerhp_flag'] = None + self.query_parameter['d2emerhp_flag'] = None + self.query_parameter['d3emerhp_flag'] = None + # 救急告示診療所 + if self.record.emergency_clinic == '@': + self.query_parameter['emergency_clinic'] = None + # 治験中核病院 + if self.record.trial_core_flag == '@': + self.query_parameter['trial_core_flag'] = None + self.query_parameter['trial_core_div'] = None + self.query_parameter['trial_core_ok_date'] = None + self.query_parameter['trial_core_can_date'] = None + # 認知症疾患医療センター + if self.record.dementia_flag == '@': + self.query_parameter['dementia_flag'] = None + self.query_parameter['dementia_okd_ate'] = None + self.query_parameter['dementia_can_date'] = None + # 特定健康診査実施機関 + if self.record.sphealth_exploration == '@': + self.query_parameter['sphealth_exploration'] = None + # 特定保健指導実施機関 + if self.record.sphealth_guidance == '@': + self.query_parameter['sphealth_guidance'] = None + + # 先進医療実施医療機関 + is_aggregate_item_clear = self.record.hiadhp_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['hiadhp_flag'] = None + # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 41): + setting_item_name_code = f'hiadhpcode{i}' + setting_item_name_kind = f'hiadhpkind{i}' + if is_aggregate_item_clear: + self.query_parameter[setting_item_name_code] = None + self.query_parameter[setting_item_name_kind] = None + + # 先端医療実施医療機関 + is_aggregate_item_clear = self.record.hitechhp_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['hitechhp_flag'] = None + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + setting_item_name = f'hitechhpkind{i}' + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None + + # 政策医療 + # 項目クリア判断 + is_aggregate_item_clear = self.record.policy_medical_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['policy_medical_flag'] = None + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name_code = f'policymedical_code{num}' + setting_item_name_content = f'policymedical_content{num}' + if is_aggregate_item_clear: + self.query_parameter[setting_item_name_code] = None + self.query_parameter[setting_item_name_content] = None + + # 訪問看護ステーション + if self.record.visitcarest_flag == '@': + self.query_parameter['visitcarest_flag'] = None + self.query_parameter['visitcarestation_id'] = None + self.query_parameter['visitcarestation_code'] = None + self.query_parameter['visitcarestation_yobi'] = None + # 開設年月 + if self.record.open_date == '@': + self.query_parameter['open_date'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py new file mode 100644 index 00000000..a8486689 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst_div import ComInstDiv + + +class ComInstDivMapper(UltmarcTableMapper): + """レイアウト区分011: COM_施設区分 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst_div + WHERE + inst_div_cd = :inst_div_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_inst_div + ( + inst_div_cd, + inst_div_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :inst_div_cd, + :inst_div_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_inst_div + SET + inst_div_name = :inst_div_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + inst_div_cd = :inst_div_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_inst_div + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + inst_div_cd = :inst_div_cd + """ + record: ComInstDiv + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInstDiv) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py new file mode 100644 index 00000000..cbf29145 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -0,0 +1,563 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst + + +class ComInstMapper(UltmarcTableMapper): + """レイアウト区分101: COM_施設 登録処理""" + + # レコード存在確認SQL(COM_施設) + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設) + INSERT_INST_QUERY = """\ + INSERT INTO src05.com_inst + ( + dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + rltd_univ_prnt_cd, + bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + ward_abolish_flg, + inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + hp_assrt_cd, + dup_opp_cd, + insp_item_micrb, + insp_item_serum, + insp_item_blood, + insp_item_patho, + insp_item_paras, + insp_item_biochem, + insp_item_ri, + re_exam_cd, + prmit_bed_num_other, + prmit_bed_num_mental, + prmit_bed_num_tuber, + prmit_bed_num_infection, + prmit_bed_num_sum, + prmit_bed_num_gen, + prmit_bed_num_rcup, + prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :hp_class_code, + :hp_addr_lost_code, + :hp_name_kana, + :hp_ryaku_name_kana, + :hp_name, + :hp_ryaku_name, + :univ_prnt_code, + :bed_num, + :close_flag, + :open_flag, + :close_year_month, + :open_year_month, + :close_flag2, + :inst_repre_code, + :president_kana, + :president, + :tel_nothing_flag, + :uncheck_flag, + :hp_tel, + :hp_addr_kana, + :hp_addr, + :hp_zip_code, + :village_code, + :pref_code, + :city_code, + :hp_addr_number, + :addr_cnt_kana, + :addr_cnt, + :mgt_class_code, + :hpdel_code, + :hp_kind_code, + :dup_opp_code, + :inspect_code1, + :inspect_code2, + :inspect_code3, + :inspect_code4, + :inspect_code5, + :inspect_code6, + :inspect_code7, + :reexam_flag, + :bed_num_gen, + :bed_num_psy, + :bed_num_tub, + :bed_num_epi, + :bed_num_sum, + :bed_num_gen2, + :bed_num_rest, + :bed_class_maint_date, + 1, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL(COM_施設) + UPDATE_INST_QUERY = """\ + UPDATE + src05.com_inst + SET + {update_columns} + abolish_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_inst + SET + abolish_ymd = :maint_date, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設診療科目) + INSERT_INST_TRT_QUERY = """\ + INSERT INTO src05.com_inst_trt_course + ( + dcf_dsf_inst_cd, + trt_course_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + {trt_course_cd}, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ削除用SQL(COM_施設診療科目) + PHYSICAL_DELETE_TRT_QUERY = """\ + DELETE FROM + src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # レコード存在確認SQL(COM_特養医務室) + RECORD_EXISTS_SPCARE_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_spcare_med_office_dat + WHERE + dcf_chld_inst_cd = :dcfdsf_inst_code + """ + + # データ更新用SQL(COM_特養医務室) + UPDATE_SPCARE_QUERY = """\ + UPDATE + src05.com_spcare_med_office_dat + SET + dcf_prnt_inst_cd = :dcf_prnt_inst_code, + update_ymd = :execute_date_str_ymd, + delete_ymd = :delete_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_chld_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_特養医務室) + INSERT_SPCARE_QUERY = """\ + INSERT INTO src05.com_spcare_med_office_dat + ( + dcf_chld_inst_cd, + dcf_prnt_inst_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :dcf_prnt_inst_code, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + record: ComInst + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInst) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.__make_upsert_query() + return + + def __make_upsert_query(self): + # レコードの存在確認(施設) + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + if record_count[0]['count_num'] == 0: + # 存在しない場合はInsert + self.queries.append(self.INSERT_INST_QUERY) + else: + # 存在する場合はUpdate(施設) + self.__make_update_query() + + # 施設診療科目の削除挿入 + self.__make_delete_insert_trt_query() + + # 特養医務室の追加更新 + self.__make_upsert_spcare_query() + + return + + def __make_update_query(self): + # 存在する場合はUpdate(施設) + set_clauses = [] # 設定項目 + + # 施設区分コード + if len(self.record.hp_class_code) > 0: + set_clauses.append('inst_div_cd = :hp_class_code') + + # 正式施設名(カナ) + if len(self.record.hp_name_kana) > 0: + set_clauses.append('form_inst_name_kana = :hp_name_kana') + + # 略式施設名(カナ) + if len(self.record.hp_ryaku_name_kana) > 0: + set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') + + # 正式施設名(漢字) + if len(self.record.hp_name) > 0: + set_clauses.append('form_inst_name_kanji = :hp_name') + + # 略式施設名(漢字) + if len(self.record.hp_ryaku_name) > 0: + set_clauses.append('inst_name_kanji = :hp_ryaku_name') + + # 施設住所カナ + if len(self.record.hp_addr_kana) > 0: + set_clauses.append('inst_addr_kana = :hp_addr_kana') + + # 施設住所 + if len(self.record.hp_addr) > 0: + set_clauses.append('inst_addr = :hp_addr') + + # 郵便番号 + if len(self.record.hp_zip_code) > 0: + set_clauses.append('postal_number = :hp_zip_code') + + # 町字コード・都道府県コード・市区町村コード + if len(self.record.village_code + self.record.pref_code + self.record.city_code) > 0: + set_clauses.append('village_cd = :village_code') + set_clauses.append('prefc_cd = :pref_code') + set_clauses.append('city_cd = :city_code') + + # 住所カウント + if len(self.record.pref_code) > 0: + set_clauses.append('addr_cnt_kana = :addr_cnt_kana') + set_clauses.append('addr_cnt = :addr_cnt') + + # 住所表示番号 + if len(self.record.hp_addr_number) > 0: + set_clauses.append('addr_display_number = :hp_addr_number') + + # 経営体コード + if len(self.record.mgt_class_code) > 0: + set_clauses.append('manage_cd = :mgt_class_code') + + # 病院種別 + if len(self.record.hp_kind_code) > 0: + set_clauses.append('hp_assrt_cd = :hp_kind_code') + + # 再審査コード + if len(self.record.reexam_flag) > 0: + set_clauses.append('re_exam_cd = :reexam_flag') + + # 未確認フラグ + if len(self.record.uncheck_flag) > 0: + set_clauses.append('unconf_flg = :uncheck_flag') + + # 削除予定理由コード + if len(self.record.hpdel_code) > 0: + set_clauses.append('delete_sche_reason_cd = :hpdel_code') + + # 重複時相手先コード + if len(self.record.dup_opp_code) > 0: + set_clauses.append('dup_opp_cd = :dup_opp_code') + + # 住所不明理由コード + if len(self.record.hp_addr_lost_code) > 0: + set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') + + # 電話番号なしフラグ + if len(self.record.tel_nothing_flag) > 0: + set_clauses.append('phone_number_non_flg = :tel_nothing_flag') + + # 電話番号 + if len(self.record.hp_tel) > 0: + set_clauses.append('inst_phone_number = :hp_tel') + + # 施設代表者コード + if len(self.record.inst_repre_code) > 0: + set_clauses.append('inst_repre_cd = :inst_repre_code') + + # 代表者(カナ) + if len(self.record.president_kana) > 0: + set_clauses.append('inst_repre_kana = :president_kana') + + # 代表者(漢字) ※「@」が大文字 + if len(self.record.president) > 0: + set_clauses.append('inst_repre = :president') + + # 開業予定フラグ・開業予定年月 + if len(self.record.open_flag + self.record.open_year_month) > 0: + set_clauses.append('estab_sche_flg = :open_flag') + set_clauses.append('estab_sche_ym = :open_year_month') + + # 休院フラグ・休院開始年月 + if len(self.record.close_flag + self.record.close_year_month) > 0: + set_clauses.append('close_flg = :close_flag') + set_clauses.append('close_start_ym = :close_year_month') + + # 関連大学親コード + if len(self.record.univ_prnt_code) > 0: + set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code') + + # 病棟閉鎖フラグ + if len(self.record.close_flag2) > 0: + set_clauses.append('ward_abolish_flg = :close_flag2') + + # 病床数(定員) + if self.record.bed_num is not None: + set_clauses.append('bed_num = :bed_num') + + # 許可病床メンテ日付 + if len(self.record.bed_class_maint_date) > 0: + set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date') + + # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) + if not self.record.prmit_bed.count(None) == len(self.record.prmit_bed): + set_clauses.append('prmit_bed_num_sum = :bed_num_sum') + set_clauses.append('prmit_bed_num_mental = :bed_num_psy') + set_clauses.append('prmit_bed_num_tuber = :bed_num_tub') + set_clauses.append('prmit_bed_num_infection = :bed_num_epi') + set_clauses.append('prmit_bed_num_other = :bed_num_gen') + set_clauses.append('prmit_bed_num_gen = :bed_num_gen2') + set_clauses.append('prmit_bed_num_rcup = :bed_num_rest') + + # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) + if sum(len(item) for item in self.record.insp_item) > 0: + set_clauses.append('insp_item_micrb = :inspect_code1') + set_clauses.append('insp_item_serum = :inspect_code2') + set_clauses.append('insp_item_blood = :inspect_code3') + set_clauses.append('insp_item_patho = :inspect_code4') + set_clauses.append('insp_item_paras = :inspect_code5') + set_clauses.append('insp_item_biochem = :inspect_code6') + set_clauses.append('insp_item_ri = :inspect_code7') + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合は更新処理は行わない + if len(update_columns) == 0: + self.queries.append(None) + return + else: + update_columns += ',' + update_query = self.UPDATE_INST_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + + return + + def __make_delete_insert_trt_query(self): + # 施設診療科目の削除挿入 + # 診療科目(集合項目)のいずれも入力がない場合、何もしない + if sum(len(item) for item in self.record.medsbj_code) == 0: + return + + # 削除 + self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY) + + # 診療科目の1つ目の値がクリアマーク(@)の場合、診療科目を登録しない + if self.record.medsbj_code[0] == "@": + return + + # 診療科目1~60 + for medsbj_code in self.record.medsbj_code: + if len(medsbj_code) > 0: + insert_query = self.INSERT_INST_TRT_QUERY.format( + trt_course_cd=f"'{medsbj_code}'" + ) + self.queries.append(insert_query) + return + + def __make_upsert_spcare_query(self): + # 特養医務室の追加、更新 + # DCF親施設コードがない場合、何もしない + if (self.record.dcf_prnt_inst_code == "00" or len(self.record.dcf_prnt_inst_code) == 0): + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_SPCARE_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + # 特養医務室の集合項目の値がクリアマーク(@)の場合、登録しない + if self.record.dcfhp_92id == "@": + return + + self.queries.append(self.INSERT_SPCARE_QUERY) + return + + # 存在する場合はUpdate + # 特養医務室の集合項目の値がクリアマーク(@)の場合、DCF親施設コードをクリアし、削除日を設定 + if self.record.dcfhp_92id == "@": + self.query_parameter['dcf_prnt_inst_code'] = None + self.query_parameter['delete_ymd'] = self.query_parameter['execute_date_str_ymd'] + else: + self.query_parameter['delete_ymd'] = None + + self.queries.append(self.UPDATE_SPCARE_QUERY) + + return + + def __set_clearing_item(self): + + # 未確認フラグ + if self.record.uncheck_flag == '@': + self.query_parameter['uncheck_flag'] = None + # 削除予定理由コード + if self.record.hpdel_code == '@': + self.query_parameter['hpdel_code'] = None + # 重複時相手先コード + if self.record.duphp_id == '@': + self.query_parameter['dup_opp_code'] = None + # 住所不明理由コード + if self.record.hp_addr_lost_code == '@': + self.query_parameter['hp_addr_lost_code'] = None + # 電話番号なしフラグ + if self.record.tel_nothing_flag == '@': + self.query_parameter['tel_nothing_flag'] = None + # 電話番号 + if self.record.hp_tel == '@': + self.query_parameter['hp_tel'] = None + # 施設代表者コード + if self.record.president_id == '@': + self.query_parameter['inst_repre_code'] = None + # 代表者(カナ) + if self.record.president_kana == '@': + self.query_parameter['president_kana'] = None + # 代表者(漢字) ※全角文字のため、クリアマーク「@」が大文字 + if self.record.president == '@': + self.query_parameter['president'] = None + # 開業予定フラグ・開業予定年月 + if self.record.open_flag == '@': + self.query_parameter['open_flag'] = None + self.query_parameter['open_year_month'] = None + # 休院フラグ・休院開始年月 + if self.record.close_flag == '@': + self.query_parameter['close_flag'] = None + self.query_parameter['close_year_month'] = None + # 関連大学親コード + if self.record.assoc_parrent_id == '@': + self.query_parameter['univ_prnt_code'] = None + # 病棟閉鎖フラグ + if self.record.close_flag2 == '@': + self.query_parameter['close_flag2'] = None + # 病床数(定員) + if self.record.bed_num == '@': + self.query_parameter['bed_num'] = None + # 許可病床メンテ日付 + if self.record.bed_class_maint_date == '@': + self.query_parameter['bed_class_maint_date'] = None + # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) + if self.record.bed_num_sum == '@': + self.query_parameter['bed_num_sum'] = None + self.query_parameter['bed_num_psy'] = None + self.query_parameter['bed_num_tub'] = None + self.query_parameter['bed_num_epi'] = None + self.query_parameter['bed_num_gen'] = None + self.query_parameter['bed_num_gen2'] = None + self.query_parameter['bed_num_rest'] = None + # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) + if self.record.inspect_code1 == '@': + self.query_parameter['inspect_code1'] = None + self.query_parameter['inspect_code2'] = None + self.query_parameter['inspect_code3'] = None + self.query_parameter['inspect_code4'] = None + self.query_parameter['inspect_code5'] = None + self.query_parameter['inspect_code6'] = None + self.query_parameter['inspect_code7'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py new file mode 100644 index 00000000..87e9b267 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py @@ -0,0 +1,94 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_manage import ComManage + + +class ComManageMapper(UltmarcTableMapper): + """レイアウト区分007: COM_経営体 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_manage + WHERE + manage_cd = :manage_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_manage + ( + manage_cd, + manage_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :manage_cd, + :manage_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_manage + SET + manage_name = :manage_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + manage_cd = :manage_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_manage + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + manage_cd = :manage_cd + """ + + record: ComManage + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComManage) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py new file mode 100644 index 00000000..e046d558 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py @@ -0,0 +1,117 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_area_city import ComMedAreaCity + + +class ComMedAreaCityMapper(UltmarcTableMapper): + """レイアウト区分124: COM_医療圏都道府県市町村対応表 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_area_city + ( + prefc_cd, + med_sphe_cd, + jis_prefc_cd, + jis_city_cd, + zen_prefcode, + zen_medareacode, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :med_sphe_cd, + :jis_prefc_cd, + :jis_city_cd, + :zen_prefcode, + :zen_medareacode, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_med_area_city + SET + zen_prefcode = :zen_prefcode, + zen_medareacode = :zen_medareacode, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + + record: ComMedAreaCity + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedAreaCity) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maintflag == 'B' and self.record.addDelDiv == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py new file mode 100644 index 00000000..ee643c6a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_func_valuation import ComMedFuncValuation + + +class ComMedFuncValuationMapper(UltmarcTableMapper): + """レイアウト区分024: COM_医療機器評価 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_func_valuation + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_func_valuation + ( + med_func_valuation_cd, + med_func_valuation_name, + regist_ymd, + update_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + + ) + VALUES ( + :med_func_valuation_cd, + :med_func_valuation_name, + :execute_date_str_ymd, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_med_func_valuation + SET + med_func_valuation_name = :med_func_valuation_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_med_func_valuation + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + record: ComMedFuncValuation + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedFuncValuation) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py new file mode 100644 index 00000000..475a6b9a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py @@ -0,0 +1,129 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_prefc import ComMedPrefc + + +class ComMedPrefcMapper(UltmarcTableMapper): + """レイアウト区分121: COM_医療圏都道府県 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_prefc + WHERE + pref_code = :pref_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_prefc + ( + pref_code, + rev_date, + post_date, + psy_bednumtg, + psy_bednumgen, + psy_bednumdate, + psy_eqbednum, + tb_bednumtg, + tb_bednumgen, + tb_bednumdate, + tb_eqbednum, + inf_bednumtg, + inf_bednumgen, + inf_bednumdate, + inf_eqbednum, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :pref_code, + :rev_date, + :post_date, + :psy_bednum_tg, + :psy_bednum_gen, + :psy_bednum_date, + :psy_eqbed_num, + :tb_bednum_tg, + :tb_bednum_gen, + :tb_bednum_date, + :tb_eqbed_num, + :inf_bednum_tg, + :inf_bednum_gen, + :inf_bednum_date, + :inf_eqbed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_med_prefc + SET + rev_date = :rev_date, + post_date = :post_date, + psy_bednumtg = :psy_bednum_tg, + psy_bednumgen = :psy_bednum_gen, + psy_bednumdate = :psy_bednum_date, + psy_eqbednum = :psy_eqbed_num, + tb_bednumtg = :tb_bednum_tg, + tb_bednumgen = :tb_bednum_gen, + tb_bednumdate = :tb_bednum_date, + tb_eqbednum = :tb_eqbed_num, + inf_bednumtg = :inf_bednum_tg, + inf_bednumgen = :inf_bednum_gen, + inf_bednumdate = :inf_bednum_date, + inf_eqbednum = :inf_eqbed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + pref_code = :pref_code + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_med_prefc + WHERE + pref_code = :pref_code + """ + + record: ComMedPrefc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedPrefc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py new file mode 100644 index 00000000..37a4c889 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py @@ -0,0 +1,95 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_nurse_assrt import ComNurseAssrt + + +class ComNurseAssrtMapper(UltmarcTableMapper): + """レイアウト区分023: COM_看護種別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_nurse_assrt + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_nurse_assrt + ( + nurse_assrt_cd, + nurse_assrt_name, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :nurse_assrt_cd, + :nurse_assrt_name, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_nurse_assrt + SET + nurse_assrt_name = :nurse_assrt_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_nurse_assrt + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + record: ComNurseAssrt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComNurseAssrt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はupdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py new file mode 100644 index 00000000..640152d6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -0,0 +1,327 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_pharm import ComPharm + + +class ComPharmMapper(UltmarcTableMapper): + """レイアウト区分102: COM_薬局 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_pharm + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_pharm + ( + dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + dup_opp_cd, + supervising_pharmacist, + supervising_pharmacist_kana, + franchise_hq_cd, + inst_pharm_div, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_cd, + :hpclass_code, + :hp_addr_lost_code, + :hp_name_kana, + :hp_ryaku_name_kana, + :hp_name, + :hp_ryaku_name, + :close_flg, + :open_flag, + :close_yearmonth, + :open_yearmonth, + :president_Kana, + :president, + :tel_nothing_flag, + :unconf_flg, + :tel_number, + :addr_kana, + :addr, + :zip_code, + :village_code, + :prefc_cd, + :city_cd, + :addr_number, + :addr_count_kana, + :addr_count, + :mgtclass_code, + :del_cd, + :dup_opp_cd, + :pharmacist, + :pharmacist_kana, + :franchise_hq_cd, + 2, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_pharm + SET + {update_columns} + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 廃業年月日 ← メンテナンス年月日 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_pharm + SET + abolish_ymd = :maintdate, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_cd + """ + record: ComPharm + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPharm) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 更新の場合 + update_columns = ','.join(self.__make_update_query()) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # 設定項目の判定 + # DCFDSF施設コード(主キーなので更新対象外) + + # 施設区分コード + if self.record.hpclass_code != '': + set_clauses.append('inst_div_cd = :hpclass_code') + + # 住所不明理由コード + if self.record.hp_addr_lost_code != '': + set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') + + # 正式施設名カナ + if self.record.hp_name_kana != '': + set_clauses.append('form_inst_name_kana = :hp_name_kana') + + # 施設名カナ + if self.record.hp_ryaku_name_kana != '': + set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') + + # 正式施設名(漢字) + if self.record.hp_name != '': + set_clauses.append('form_inst_name_kanji = :hp_name') + + # 施設名(漢字) + if self.record.hp_ryaku_name != '': + set_clauses.append('inst_name_kanji = :hp_ryaku_name') + + # 休院フラグ、休院予定年月 + if len(self.record.close_flg + self.record.close_yearmonth) > 0: + set_clauses.append('close_flg = :close_flg') + set_clauses.append('close_start_ym = :close_yearmonth') + + # 開業予定フラグ、開業予定年月 + if len(self.record.open_flag + self.record.open_yearmonth) > 0: + set_clauses.append('estab_sche_flg = :open_flag') + set_clauses.append('estab_sche_ym = :open_yearmonth') + + # 施設代表者カナ + if self.record.president_Kana != '': + set_clauses.append('inst_repre_kana = :president_Kana') + + # 施設代表者 + if self.record.president != '': + set_clauses.append('inst_repre = :president') + + # 電話番号なしフラグ + if self.record.tel_nothing_flag != '': + set_clauses.append('phone_number_non_flg = :tel_nothing_flag') + + # 未確認フラグ + if self.record.unconf_flg != '': + set_clauses.append('unconf_flg = :unconf_flg') + + # 施設電話番号 + if self.record.tel_number != '': + set_clauses.append('inst_phone_number = :tel_number') + + # 施設住所カナ + if self.record.addr_kana != '': + set_clauses.append('inst_addr_kana = :addr_kana') + + # 施設住所 + if self.record.addr != '': + set_clauses.append('inst_addr = :addr') + + # 郵便番号 + if self.record.zip_code != '': + set_clauses.append('postal_number = :zip_code') + + # 町字コード(住所コード) + if len(self.record.village_code) > 0: + set_clauses.append('village_cd = :village_code') # 住所コード + set_clauses.append('prefc_cd = :prefc_cd') # 都道府県コード + set_clauses.append('city_cd = :city_cd') # 市区町村コード + + # 住所表示番号 + if self.record.addr_number != '': + set_clauses.append('addr_display_number = :addr_number') + + # 住所カウント(集合項目である県コードが入っていればカウントをセットする) + if len(self.record.prefc_cd) > 0: + set_clauses.append('addr_cnt = :addr_count') # 住所カウント + set_clauses.append('addr_cnt_kana = :addr_count_kana') # 住所カウントカナ + + # 経営体コード + if self.record.mgtclass_code != '': + set_clauses.append('manage_cd = :mgtclass_code') + + # 削除予定理由コード + if self.record.del_cd != '': + set_clauses.append('delete_sche_reason_cd = :del_cd') + + # 重複時相手先コード + if self.record.dup_opp_cd != '': + set_clauses.append('dup_opp_cd = :dup_opp_cd') + + # 管理薬剤師名(漢字)※@が大文字 + if self.record.pharmacist != '': + set_clauses.append('supervising_pharmacist = :pharmacist') + + # 管理薬剤師名(カナ) + if self.record.pharmacist_kana != '': + set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana') + + # チェーン店本部コード + if self.record.franchise_hq_id != '': + set_clauses.append('franchise_hq_cd = :franchise_hq_cd') + + return set_clauses + + def __set_clearing_item(self): + # 住所不明理由コード + if self.record.hp_addr_lost_code == '@': + self.query_parameter['hp_addr_lost_code'] = None + # 休院フラグ、休院予定年月 + if self.record.close_flg == '@': + self.query_parameter['close_flg'] = None + self.query_parameter['close_yearmonth'] = None + # 開業予定フラグ、開業予定年月 + if self.record.open_flag == '@': + self.query_parameter['open_flag'] = None + self.query_parameter['open_yearmonth'] = None + # 施設代表者カナ + if self.record.president_Kana == '@': + self.query_parameter['president_Kana'] = None + # 施設代表者 ※@が大文字 + if self.record.president == '@': + self.query_parameter['president'] = None + # 電話番号なしフラグ + if self.record.tel_nothing_flag == '@': + self.query_parameter['tel_nothing_flag'] = None + # 未確認フラグ + if self.record.unconf_flg == '@': + self.query_parameter['unconf_flg'] = None + # 施設電話番号 + if self.record.tel_number == '@': + self.query_parameter['tel_number'] = None + # 住所表示番号 + if self.record.addr_number == '@': + self.query_parameter['addr_number'] = None + # 削除予定理由コード + if self.record.del_cd == '@': + self.query_parameter['del_cd'] = None + # 重複時相手先コード + if self.record.duphp_id == '@': + self.query_parameter['dup_opp_cd'] = None + # 管理薬剤師名(漢字) ※@が大文字 + if self.record.pharmacist == '@': + self.query_parameter['pharmacist'] = None + # 管理薬剤師名(カナ) + if self.record.pharmacist_kana == '@': + self.query_parameter['pharmacist_kana'] = None + # チェーン店本部コード + if self.record.franchise_hq_id == '@': + self.query_parameter['franchise_hq_cd'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py new file mode 100644 index 00000000..0eba2a49 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + +from src.batch.ultmarc.utmp_tables.tables.com_policy_med import ComPolicyMed + + +class ComPolicyMedMapper(UltmarcTableMapper): + """レイアウト区分028: COM_政策医療 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_policy_med + WHERE + policy_med_cd = :policy_med_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_policy_med + ( + policy_med_cd, + field_name, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :policy_med_cd, + :field_name, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_policy_med + SET + field_name = :field_name, + update_ymd = :execute_date_str_ymd, + delete_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + policy_med_cd = :policy_med_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 削除年月日 ← システム日付 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_policy_med + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + policy_med_cd = :policy_med_cd + """ + record: ComPolicyMed + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPolicyMed) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py new file mode 100644 index 00000000..af13b51f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py @@ -0,0 +1,92 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_post import ComPost + + +class ComPostMapper(UltmarcTableMapper): + """レイアウト区分005: COM_役職 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_post + WHERE + post_cd = :post_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_post + ( + post_cd, + form_post_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :post_cd, + :form_post_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_post + SET + form_post_name = :form_post_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + post_cd = :post_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_post + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + post_cd = :post_cd + """ + record: ComPost + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPost) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py new file mode 100644 index 00000000..db54cb40 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py @@ -0,0 +1,489 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_base import \ + ComPrefcMedBase + + +class ComPrefcMedBaseMapper(UltmarcTableMapper): + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_base + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_base + ( + dcf_dsf_inst_cd, + info_date, + home_page, + hppre_flg, + expre_flg, + trial_flg, + trial_contcount, + trialwhet_from, + trialwhet_to, + equipment_flg, + cos_disease_flg, + cos_surgery, + specialclinic_flg, + establishment_flg, + critical_flg, + cop_system, + sys_exists_flg, + sys_inspection, + sys_prescription, + sys_reserv, + icduse_flg, + echart_flg, + fulltime_flg, + fulltime_count, + ge_patient_avg, + mt_patient_avg, + mc_patient_avg, + ca_patient_avg, + pys_patient_avg, + tub_patient_avg, + inf_patient_avg, + patient_avg_sum, + patient_avg_from, + patient_avg_to, + cl_patient_avg, + cl_patient_avg_from, + cl_patient_avg_to, + hm_patient_avg, + hm_patient_avg_from, + hm_patient_avg_to, + ge_patient_ex, + mt_patient_ex, + mc_patient_ex, + ca_patient_ex, + pys_patient_ex, + tub_patient_ex, + inf_patient_ex, + patient_ex_sum, + patient_ex_from, + patient_ex_to, + cl_patient_ex, + cl_patient_ex_from, + cl_patient_ex_to, + hm_patient_ex, + hm_patient_ex_from, + hm_patient_ex_to, + ge_stay_avg, + mt_stay_avg, + mc_stay_avg, + ca_stay_avg, + pys_stay_avg, + tub_stay_avg, + inf_stay_avg, + stay_avg_sum, + stay_avg_from, + stay_avg_to, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :info_date, + :home_page, + :hppre_flg, + :expre_flg, + :trial_flg, + :trial_cont_count, + :trial_whet_from, + :trial_whet_to, + :equipment_flg, + :cos_disease_flg, + :cos_surgery, + :specialclinic_flg, + :establishment_flg, + :critical_flg, + :cop_system, + :sys_exists_flg, + :sys_inspection, + :sys_prescription, + :sys_reserv, + :icduse_flg, + :echart_flg, + :fulltime_flg, + :fulltime_count, + :ge_patient_avg, + :mt_patient_avg, + :mc_patient_avg, + :ca_patient_avg, + :pys_patient_avg, + :tub_patient_avg, + :inf_patient_avg, + :patient_avg_sum, + :patient_avg_from, + :patient_avg_to, + :cl_patient_avg, + :cl_patient_avg_from, + :cl_patient_avg_to, + :hm_patient_avg, + :hm_patient_avg_from, + :hm_patient_avg_to, + :ge_patient_ex, + :mt_patient_ex, + :mc_patient_ex, + :ca_patient_ex, + :pys_patient_ex, + :tub_patient_ex, + :inf_patient_ex, + :patient_ex_sum, + :patient_ex_from, + :patient_ex_to, + :cl_patient_ex, + :cl_patient_ex_from, + :cl_patient_ex_to, + :hm_patient_ex, + :hm_patient_ex_from, + :hm_patient_ex_to, + :ge_stay_avg, + :mt_stay_avg, + :mc_stay_avg, + :ca_stay_avg, + :pys_stay_avg, + :tub_stay_avg, + :inf_stay_avg, + :stay_avg_sum, + :stay_avg_from, + :stay_avg_to, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_base + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_base + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + record: ComPrefcMedBase + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedBase) + program_name = __name__.split(".")[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter["program_name"] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = { + **self.query_parameter, + **self.record.to_sql_parameter(), + } + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == "B" and self.record.adddel_div == "1": + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # レコードの存在確認 + record_count = self.db.execute_select( + self.RECORD_EXISTS_QUERY, self.query_parameter + ) + # 存在しない場合はInsert + if record_count[0]["count_num"] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.__make_update_query() + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # 情報年月日 + if len(self.record.info_date) > 0: + set_clauses.append("info_date = :info_date") + + # 案内用ホームページアドレス + if len(self.record.home_page) > 0: + set_clauses.append("home_page = :home_page") + + # 院内処方フラグ + if len(self.record.hppre_flg) > 0: + set_clauses.append("hppre_flg = :hppre_flg") + + # 院外処方フラグ + if len(self.record.expre_flg) > 0: + set_clauses.append("expre_flg = :expre_flg") + + # 治験の実施 + if len(self.record.trial_flg) > 0: + set_clauses.append("trial_flg = :trial_flg") + set_clauses.append("trial_contcount = :trial_cont_count") + set_clauses.append("trialwhet_from = :trial_whet_from") + set_clauses.append("trialwhet_to = :trial_whet_to") + + # 保有する施設設備フラグ + if len(self.record.equipment_flg) > 0: + set_clauses.append("equipment_flg = :equipment_flg") + + # 対応することができる疾患・治療の内容フラグ + if len(self.record.cos_disease_flg) > 0: + set_clauses.append("cos_disease_flg = :cos_disease_flg") + + # 対応することができる短期滞在手術フラグ + if len(self.record.cos_surgery) > 0: + set_clauses.append("cos_surgery = :cos_surgery") + + # 専門外来フラグ + if len(self.record.specialclinic_flg) > 0: + set_clauses.append("specialclinic_flg = :specialclinic_flg") + + # 地域医療連携体制_窓口設置フラグ + if len(self.record.establishment_flg) > 0: + set_clauses.append("establishment_flg = :establishment_flg") + + # 地域医療連携体制_地域連携パスフラグ + if len(self.record.critical_flg) > 0: + set_clauses.append("critical_flg = :critical_flg") + + # 入院診療計画策定時における院内の連携体制 + if len(self.record.cop_system) > 0: + set_clauses.append("cop_system = :cop_system") + + # オーダリングシステム + if len(self.record.sys_exists_flg) > 0: + set_clauses.append("sys_exists_flg = :sys_exists_flg") + set_clauses.append("sys_inspection = :sys_inspection") + set_clauses.append("sys_prescription = :sys_prescription") + set_clauses.append("sys_reserv = :sys_reserv") + + # ICDコード利用フラグ + if len(self.record.icduse_flg) > 0: + set_clauses.append("icduse_flg = :icduse_flg") + + # 電子カルテフラク + if len(self.record.echart_flg) > 0: + set_clauses.append("echart_flg = :echart_flg") + + # 専任従事者 + if len(self.record.fulltime_flg) > 0: + set_clauses.append("fulltime_flg = :fulltime_flg") + set_clauses.append("fulltime_count = :fulltime_count") + + # 病床患者数平均 + if len(self.record.ge_patient_avg) > 0: + set_clauses.append("ge_patient_avg = :ge_patient_avg") + set_clauses.append("mt_patient_avg = :mt_patient_avg") + set_clauses.append("mc_patient_avg = :mc_patient_avg") + set_clauses.append("ca_patient_avg = :ca_patient_avg") + set_clauses.append("pys_patient_avg = :pys_patient_avg") + set_clauses.append("tub_patient_avg = :inf_patient_avg") + set_clauses.append("inf_patient_avg = :tub_patient_avg") + set_clauses.append("patient_avg_sum = :patient_avg_sum") + set_clauses.append("patient_avg_from = :patient_avg_from") + set_clauses.append("patient_avg_to = :patient_avg_to") + + # 患者数平均 + if len(self.record.cl_patient_avg) > 0: + set_clauses.append("cl_patient_avg = :cl_patient_avg") + set_clauses.append("cl_patient_avg_from = :cl_patient_avg_from") + set_clauses.append("cl_patient_avg_to = :cl_patient_avg_to") + + # 患者数平均 + if len(self.record.hm_patient_avg) > 0: + set_clauses.append("hm_patient_avg = :hm_patient_avg") + set_clauses.append("hm_patient_avg_from = :hm_patient_avg_from") + set_clauses.append("hm_patient_avg_to = :hm_patient_avg_to") + + # 患者数延数 + if len(self.record.ge_patient_ex) > 0: + set_clauses.append("ge_patient_ex = :ge_patient_ex") + set_clauses.append("mt_patient_ex = :mt_patient_ex") + set_clauses.append("mc_patient_ex = :mc_patient_ex") + set_clauses.append("ca_patient_ex = :ca_patient_ex") + set_clauses.append("pys_patient_ex = :pys_patient_ex") + set_clauses.append("tub_patient_ex = :tub_patient_ex") + set_clauses.append("inf_patient_ex = :inf_patient_ex") + set_clauses.append("patient_ex_sum = :patient_ex_sum") + set_clauses.append("patient_ex_from = :patient_ex_from") + set_clauses.append("patient_ex_to = :patient_ex_to") + + # 患者数延数 + if len(self.record.cl_patient_ex) > 0: + set_clauses.append("cl_patient_ex = :cl_patient_ex") + set_clauses.append("cl_patient_ex_from = :cl_patient_ex_from") + set_clauses.append("cl_patient_ex_to = :cl_patient_ex_to") + + # 患者数延数 + if len(self.record.hm_patient_ex) > 0: + set_clauses.append("hm_patient_ex = :hm_patient_ex") + set_clauses.append("hm_patient_ex_from = :hm_patient_ex_from") + set_clauses.append("hm_patient_ex_to = :hm_patient_ex_to") + + # 平均在院日数 + if len(self.record.ge_stay_avg) > 0: + set_clauses.append("ge_stay_avg = :ge_stay_avg") + set_clauses.append("mt_stay_avg = :mt_stay_avg") + set_clauses.append("mc_stay_avg = :mc_stay_avg") + set_clauses.append("ca_stay_avg = :ca_stay_avg") + set_clauses.append("pys_stay_avg = :pys_stay_avg") + set_clauses.append("tub_stay_avg = :tub_stay_avg") + set_clauses.append("inf_stay_avg = :inf_stay_avg") + set_clauses.append("stay_avg_sum = :stay_avg_sum") + set_clauses.append("stay_avg_from = :stay_avg_from") + set_clauses.append("stay_avg_to = :stay_avg_to") + + update_columns = ",".join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += "," + update_query = self.UPDATE_QUERY.format(update_columns=update_columns) + return update_query + + def __set_clearing_item(self): + # 情報年月日 + if self.record.info_date == "@": + self.query_parameter["info_date"] = None + # 案内用ホームページアドレス + if self.record.home_page == "@": + self.query_parameter["home_page"] = None + # 院内処方フラグ + if self.record.hppre_flg == "@": + self.query_parameter["hppre_flg"] = None + # 院外処方フラグ + if self.record.expre_flg == "@": + self.query_parameter["expre_flg"] = None + # 治験の実施 + if self.record.trial_flg == "@": + self.query_parameter["trial_flg"] = None + self.query_parameter["trial_cont_count"] = None + self.query_parameter["trial_whet_from"] = None + self.query_parameter["trial_whet_to"] = None + # 保有する施設設備フラグ + if self.record.equipment_flg == "@": + self.query_parameter["equipment_flg"] = None + # 対応することができる疾患・治療の内容フラグ + if self.record.cos_disease_flg == "@": + self.query_parameter["cos_disease_flg"] = None + # 対応することができる短期滞在手術フラグ + if self.record.cos_surgery == "@": + self.query_parameter["cos_surgery"] = None + # 専門外来フラグ + if self.record.specialclinic_flg == "@": + self.query_parameter["specialclinic_flg"] = None + # 地域医療連携体制_窓口設置フラグ + if self.record.establishment_flg == "@": + self.query_parameter["establishment_flg"] = None + # 地域医療連携体制_地域連携パスフラグ + if self.record.critical_flg == "@": + self.query_parameter["critical_flg"] = None + # 入院診療計画策定時における院内の連携体制 + if self.record.cop_system == "@": + self.query_parameter["cop_system"] = None + # オーダリングシステム + if self.record.sys_exists_flg == "@": + self.query_parameter["sys_exists_flg"] = None + self.query_parameter["sys_inspection"] = None + self.query_parameter["sys_prescription"] = None + self.query_parameter["sys_reserv"] = None + # ICDコード利用フラグ + if self.record.icduse_flg == "@": + self.query_parameter["icduse_flg"] = None + # 電子カルテフラク + if self.record.echart_flg == "@": + self.query_parameter["echart_flg"] = None + # 専任従事者 + if self.record.fulltime_flg == "@": + self.query_parameter["fulltime_flg"] = None + self.query_parameter["fulltime_count"] = None + # 病床患者数平均 + if self.record.ge_patient_avg == "@": + self.query_parameter["ge_patient_avg"] = None + self.query_parameter["mt_patient_avg"] = None + self.query_parameter["mc_patient_avg"] = None + self.query_parameter["ca_patient_avg"] = None + self.query_parameter["pys_patient_avg"] = None + self.query_parameter["inf_patient_avg"] = None + self.query_parameter["tub_patient_avg"] = None + self.query_parameter["patient_avg_sum"] = None + self.query_parameter["patient_avg_from"] = None + self.query_parameter["patient_avg_to"] = None + # 患者数平均 + if self.record.cl_patient_avg == "@": + self.query_parameter["cl_patient_avg"] = None + self.query_parameter["cl_patient_avg_from"] = None + self.query_parameter["cl_patient_avg_to"] = None + # 患者数平均 + if self.record.hm_patient_avg == "@": + self.query_parameter["hm_patient_avg"] = None + self.query_parameter["hm_patient_avg_from"] = None + self.query_parameter["hm_patient_avg_to"] = None + # 患者数延数 + if self.record.ge_patient_ex == "@": + self.query_parameter["ge_patient_ex"] = None + self.query_parameter["mt_patient_ex"] = None + self.query_parameter["mc_patient_ex"] = None + self.query_parameter["ca_patient_ex"] = None + self.query_parameter["pys_patient_ex"] = None + self.query_parameter["tub_patient_ex"] = None + self.query_parameter["inf_patient_ex"] = None + self.query_parameter["patient_ex_sum"] = None + self.query_parameter["patient_ex_from"] = None + self.query_parameter["patient_ex_to"] = None + # 患者数延数 + if self.record.cl_patient_ex == "@": + self.query_parameter["cl_patient_ex"] = None + self.query_parameter["cl_patient_ex_from"] = None + self.query_parameter["cl_patient_ex_to"] = None + # 患者数延数 + if self.record.hm_patient_ex == "@": + self.query_parameter["hm_patient_ex"] = None + self.query_parameter["hm_patient_ex_from"] = None + self.query_parameter["hm_patient_ex_to"] = None + # 平均在院日数 + if self.record.ge_stay_avg == "@": + self.query_parameter["ge_stay_avg"] = None + self.query_parameter["mt_stay_avg"] = None + self.query_parameter["mc_stay_avg"] = None + self.query_parameter["ca_stay_avg"] = None + self.query_parameter["pys_stay_avg"] = None + self.query_parameter["tub_stay_avg"] = None + self.query_parameter["inf_stay_avg"] = None + self.query_parameter["stay_avg_sum"] = None + self.query_parameter["stay_avg_from"] = None + self.query_parameter["stay_avg_to"] = None + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py new file mode 100644 index 00000000..28c072a6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py @@ -0,0 +1,106 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_dis_treat import \ + ComPrefcMedDisTreat + + +class ComPrefcMedDisTreatMapper(UltmarcTableMapper): + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_dis_treat + ( + dcf_dsf_inst_cd, + treatment_code, + pre_num, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :treatment_code, + :pre_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_dis_treat + SET + pre_num = :pre_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + + record: ComPrefcMedDisTreat + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedDisTreat) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # 修正のレコードだった場合はNULLに変換する + if self.record.pre_num == '@': + self.query_parameter['pre_num'] = None + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + if self.record.is_pre_num_not_empty: + return self.UPDATE_QUERY + else: + return None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py new file mode 100644 index 00000000..d48059af --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py @@ -0,0 +1,107 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_equpment import \ + ComPrefcMedEqupment + + +class ComPrefcMedEqupmentMapper(UltmarcTableMapper): + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_equpment + ( + dcf_dsf_inst_cd, + equipment_code, + bednum, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :equipment_code, + :bed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_equpment + SET + bednum = :bed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + + record: ComPrefcMedEqupment + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedEqupment) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # 修正のレコードだった場合はNULLに変換する + if self.record.bed_num == '@': + self.query_parameter['bed_num'] = None + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + # 病床数が空の場合は更新しない + if self.record.is_bed_num_not_empty: + return self.UPDATE_QUERY + else: + return None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py new file mode 100644 index 00000000..d1883e68 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py @@ -0,0 +1,95 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sojourn_ope import ComPrefcMedSojournOpe + + +class ComPrefcMedSojournOpeMapper(UltmarcTableMapper): + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_sojourn_ope + ( + dcf_dsf_inst_cd, + cos_surgery_code, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :cos_surgery_code, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_sojourn_ope + SET + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + + record: ComPrefcMedSojournOpe + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedSojournOpe) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py new file mode 100644 index 00000000..5c5f488f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py @@ -0,0 +1,133 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import ( + UltmarcTableMapper, +) +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sp_outpat import ( + ComPrefcMedSpOutpat, +) + + +class ComPrefcMedSpOutpatMapper(UltmarcTableMapper): + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_sp_outpat + ( + dcf_dsf_inst_cd, + specialclinic_name, + sort_key, + sectsub_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :specialclinic_name, + :sort_key, + :sectsub_cd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_sp_outpat + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + + record: ComPrefcMedSpOutpat + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedSpOutpat) + program_name = __name__.split(".")[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter["program_name"] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = { + **self.query_parameter, + **self.record.to_sql_parameter(), + } + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == "B" and self.record.adddel_div == "1": + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # 修正のレコードだった場合はNULLに変換する + if self.record.sectsub_cd == "@": + self.query_parameter["sectsub_cd"] = None + + # レコードの存在確認 + record_count = self.db.execute_select( + self.RECORD_EXISTS_QUERY, self.query_parameter + ) + # 存在しない場合はInsert + if record_count[0]["count_num"] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.__make_update_query() + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # ソートキー + if len(self.record.sort_key) > 0: + set_clauses.append("sort_key = :sort_key") + + # 分類補助コード + if len(self.record.sectsub_cd) > 0: + set_clauses.append("sectsub_cd = :sectsub_cd") + + update_columns = ",".join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += "," + update_query = self.UPDATE_QUERY.format(update_columns=update_columns) + return update_query diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py new file mode 100644 index 00000000..925234fb --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py @@ -0,0 +1,95 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_regn_critic_pass import ComRegnCriticPass + + +class ComRegnCriticPassMapper(UltmarcTableMapper): + """レイアウト区分026: COM_地域クリティカルパス 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_regn_critic_pass + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_regn_critic_pass + ( + regn_co_critic_pass_cd, + disease_name_kanji, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :regn_co_critic_pass_cd, + :disease_name_kanji, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_regn_critic_pass + SET + disease_name_kanji = :disease_name_kanji, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_regn_critic_pass + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + record: ComRegnCriticPass + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComRegnCriticPass) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py new file mode 100644 index 00000000..e0e981b3 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py @@ -0,0 +1,94 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_rehabili import ComRehabili + + +class ComRehabiliMapper(UltmarcTableMapper): + """レイアウト区分027: COM_疾患別リハビリテーション科 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_rehabili + WHERE + rehabili_cd = :rehabili_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_rehabili + ( + rehabili_cd, + rehabili_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :rehabili_cd, + :rehabili_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_rehabili + SET + rehabili_name = :rehabili_name, + update_ymd = :execute_date_str_ymd, + delete_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + rehabili_cd = :rehabili_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_rehabili + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + rehabili_cd = :rehabili_cd + """ + record: ComRehabili + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComRehabili) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py new file mode 100644 index 00000000..c1c50269 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py @@ -0,0 +1,113 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_snd_med_sphe import ComSndMedSphe + + +class ComSndMedSpheMapper(UltmarcTableMapper): + """レイアウト区分123: COM_医療圏二次医療圏 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_snd_med_sphe + ( + prefc_cd, + med_sphe_cd, + thrd_cd, + snd_med_sphe_name, + requd_bed_or_equip_target, + exist_bed_num, + exist_bed_num_regist_ymd, + plsmns_bed_num, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :med_sphe_cd, + :thrd_cd, + :snd_med_sphe_name, + :requd_bed_or_equip_target, + :exist_bed_num, + :exist_bed_num_regist_ymd, + :plsmns_bed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_snd_med_sphe + SET + thrd_cd = :thrd_cd, + snd_med_sphe_name = :snd_med_sphe_name, + requd_bed_or_equip_target = :requd_bed_or_equip_target, + exist_bed_num = :exist_bed_num, + exist_bed_num_regist_ymd = :exist_bed_num_regist_ymd, + plsmns_bed_num = :plsmns_bed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + + record: ComSndMedSphe + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSndMedSphe) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py new file mode 100644 index 00000000..897dc15b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_sosiety import ComSosiety + + +class ComSosietyMapper(UltmarcTableMapper): + """レイアウト区分009: COM_学会 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_sosiety + WHERE + sosiety_cd = :sosiety_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_sosiety + ( + sosiety_cd, + sosiety_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :sosiety_cd, + :sosiety_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_sosiety + SET + sosiety_name = :sosiety_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_sosiety + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + """ + record: ComSosiety + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSosiety) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py new file mode 100644 index 00000000..3c690403 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -0,0 +1,158 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_sp_field import ComSpField + + +class ComSpFieldMapper(UltmarcTableMapper): + """レイアウト区分511: COM_専門分野 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialist_cd = :specialist_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_sp_field + ( + dcf_pcf_dr_cd, + specialist_cd, + specialist_maint_div, + specialist_flg, + specialist_publsh_ymd, + ackn_med_flg, + ackn_med_publsh_ymd, + guide_med_flg, + guide_med_publsh_ymd, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcf_pcf_dr_cd, + :specialist_cd, + :specialist_maint_div, + :specialist_flg, + :specialist_publsh_ymd, + :ackn_med_flg, + :ackn_med_publsh_ymd, + :guide_med_flg, + :guide_med_publsh_ymd, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_sp_field + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialist_cd = :specialist_cd + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialist_cd = :specialist_cd + """ + record: ComSpField + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSpField) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.specialist_maint_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + set_clauses = [] # 設定項目 + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + + # 「@」による項目クリアを設定 + self.__set_clearing_item() + + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + if len(self.record.specialist_maint_div) > 0: + set_clauses.append('specialist_maint_div = :specialist_maint_div') + + if len(self.record.specialist_flg) > 0: + set_clauses.append('specialist_flg = :specialist_flg') + set_clauses.append('specialist_publsh_ymd = :specialist_publsh_ymd') + + if len(self.record.ackn_med_flg) > 0: + set_clauses.append('ackn_med_flg = :ackn_med_flg') + set_clauses.append('ackn_med_publsh_ymd = :ackn_med_publsh_ymd') + + if len(self.record.guide_med_flg) > 0: + set_clauses.append('guide_med_flg = :guide_med_flg') + set_clauses.append('guide_med_publsh_ymd = :guide_med_publsh_ymd') + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query + + def __set_clearing_item(self): + + # 専門医の集合項目クリア + if self.record.specialist_flg == '@': + self.query_parameter['specialist_flg'] = None + self.query_parameter['specialist_publsh_ymd'] = None + # 認定医の集合項目クリア + if self.record.ackn_med_flg == '@': + self.query_parameter['ackn_med_flg'] = None + self.query_parameter['ackn_med_publsh_ymd'] = None + # 指導医の集合項目クリア + if self.record.guide_med_flg == '@': + self.query_parameter['guide_med_flg'] = None + self.query_parameter['guide_med_publsh_ymd'] = None + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py new file mode 100644 index 00000000..2d3f7934 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_specialist_license import ComSpecialistLicense + + +class ComSpecialistLicenseMapper(UltmarcTableMapper): + """レイアウト区分010: COM_専門医資格 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_specialist_license + WHERE + specialist_cd = :specialist_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_specialist_license + ( + specialist_cd, + specialist_license_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :specialist_cd, + :specialist_license_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_specialist_license + SET + specialist_license_name = :specialist_license_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + specialist_cd = :specialist_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_specialist_license + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + specialist_cd = :specialist_cd + """ + record: ComSpecialistLicense + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSpecialistLicense) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py new file mode 100644 index 00000000..a51eb4be --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py @@ -0,0 +1,98 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_thrd_med import ComThrdMed + + +class ComThrdMedMapper(UltmarcTableMapper): + """レイアウト区分122: COM_医療圏3次マスタ 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_thrd_med + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_thrd_med + ( + prefcode, + thrd_cd, + thrd_med_sphe_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :pref_code, + :thrd_cd, + :thrd_med_sphe_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_thrd_med + SET + thrd_med_sphe_name = :thrd_med_sphe_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_thrd_med + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + + record: ComThrdMed + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComThrdMed) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py new file mode 100644 index 00000000..b8d1dd52 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py @@ -0,0 +1,99 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_trt_course import ComTrtCourse + + +class ComTrtCourseMapper(UltmarcTableMapper): + """レイアウト区分001: COM_診療科目 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_trt_course + WHERE + trt_course_cd = :trt_course_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_trt_course + ( + trt_course_cd, + trt_course_name_kana, + trt_course_name_abb, + trt_course_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :trt_course_cd, + :trt_course_name_kana, + :trt_course_name_abb, + :trt_course_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_trt_course + SET + trt_course_name_kana = :trt_course_name_kana, + trt_course_name_abb = :trt_course_name_abb, + trt_course_name = :trt_course_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + trt_course_cd = :trt_course_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_trt_course + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + trt_course_cd = :trt_course_cd + """ + record: ComTrtCourse + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComTrtCourse) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py new file mode 100644 index 00000000..299d0556 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.mst_prefc import MstPrefc + + +class MstPrefcMapper(UltmarcTableMapper): + """レイアウト区分006: 都道府県マスタ 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.mst_prefc + WHERE + prefc_cd = :prefc_cd + """ + + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.mst_prefc + ( + prefc_cd, + prefc_name, + prefc_name_kana, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :prefc_name, + '', + '0', + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.mst_prefc + SET + prefc_name = :prefc_name, + delete_flg = '0', + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.mst_prefc + SET + delete_flg = '1', + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + """ + record: MstPrefc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, MstPrefc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py new file mode 100644 index 00000000..9b5d93a1 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py @@ -0,0 +1,8 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + + +class NullMapper(UltmarcTableMapper): + + def make_query(self): + return super().make_query() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py new file mode 100644 index 00000000..7aa1f311 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -0,0 +1,50 @@ +from abc import ABCMeta, abstractmethod +from datetime import datetime + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable +from src.db.database import Database + +# 処理日を使用するために、configを使用 +batch_context = BatchContext.get_instance() + + +class UltmarcTableMapper(metaclass=ABCMeta): + """アルトマークテーブルへの登録処理の抽象クラス""" + + record: UltmarcTable + db: Database + queries: list[str] + query_parameter: dict + + def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None: + self.record = table_class(record) + self.db = db + + # 実行年月日(文字列)、実行年月日時分秒を設定 + now = datetime.now() + execute_date_str_ymd = now.strftime('%Y%m%d') + execute_datetime = now.strftime('%Y/%m/%d %H:%M:%S') + # クエリリストを初期化 + self.queries = [] + # 共通クエリパラメータを設定 + self.query_parameter = { + 'execute_date_str_ymd': execute_date_str_ymd, + 'execute_datetime': execute_datetime, + # バッチ共通設定から処理日を取得 + 'syor_date': batch_context.syor_date + } + + @abstractmethod + def make_query(self): + pass + + def execute_queries(self): + if len(self.queries) == 0: + raise Exception('make_queryを呼び出してから実行してください') + + for query in self.queries: + if query is None: + continue + + self.db.execute(query, self.query_parameter) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py new file mode 100644 index 00000000..80940b09 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComAlma(UltmarcTable): + """レイアウト区分004: COM_出身校""" + maint_flag: str # 修正区分 + alma_cd: str # 出身校コード + alma: str # 出身校 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.alma_cd = record[1] + self.alma = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py new file mode 100644 index 00000000..ae508b35 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py @@ -0,0 +1,20 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComAlmaDepartDisc(UltmarcTable): + """レイアウト区分003: COM_出身校学部識別""" + alma_cd: str # 出身校コード + depart_disc_cd: str # 学部識別コード + estab_e: str # 創立元号 + estab_y: str # 創立年 + alma_name: str # 出身校名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.alma_cd = record[1] + self.depart_disc_cd = record[2] + self.maint_flag = record[3] + self.alma_name = record[6] + self.estab_e = record[7] + self.estab_y = record[8] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py new file mode 100644 index 00000000..20395f9f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py @@ -0,0 +1,22 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComBlngSec(UltmarcTable): + """レイアウト区分008: COM_所属部科""" + blng_sec_cd: str # 所属部科コード + blng_sec_kana: str # 所属部科カナ + blng_sec_name: str # 所属部科名 + inst_category: str # 分類補助コード(施設分類) + trt_category: str # 分類補助コード(診療分野分類) + category_sort: str # 分類補助コード(ソートコード) + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.blng_sec_cd = record[1] + self.maint_flag = record[2] + self.blng_sec_name = record[5] + self.blng_sec_kana = record[6] + self.inst_category = record[7] + self.trt_category = record[8] + self.category_sort = record[9] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py new file mode 100644 index 00000000..886b9dad --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py @@ -0,0 +1,36 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComCopHp(UltmarcTable): + """レイアウト区分112: COM_臨床研修病院""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + cophp_id: str # 協力型病院コード(ID) + cophp_code: str # 協力型病院コード(コード) + cophp_yobi: str # 協力型病院コード(予備) + open_year: str # 開始年度 + sort_key: str # ソートキー + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + cophp_code: str # 協力型病院コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3] + self.maint_flag = record[4] + self.cophp_id = record[5] + self.cophp_code = record[6] + self.cophp_yobi = record[7] + self.open_year = record[8] + self.adddel_div = record[9] + self.sort_key = record[12] + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) + # 協力型病院コード + self.cophp_code = ''.join([self.cophp_id, self.cophp_code, self.cophp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py new file mode 100644 index 00000000..6023d6f5 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py @@ -0,0 +1,183 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDr(UltmarcTable): + """レイアウト区分501: COM_医師""" + dcfdr_id: str # 個人コード(レコードID) + dcfdr_code: str # 個人コード(個人コード) + dcfd_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + drdel_code: str # 削除予定理由 + reptdr_id: str # 重複時相手先コード(レコードID) + reptdr_code: str # 重複時相手先コード(個人コード) + reptdr_yobi: str # 重複時相手先コード(予備) + dr_name: str # 医師名(漢字) + dr_name_kana: str # 医師名(カナ) + sex_code: str # 性別 + birthday_era: str # 生年月日(元号) + birthday_year: str # 生年月日(年) + birthday_month: str # 生年月日(月) + birthday_day: str # 生年月日(日) + home_town_code: str # 出身都道府県コード + medassoci_code: str # 医師会コード + grad_yearera: str # 卒年_元号 + grad_year: str # 卒年_年 + graduniv_code: str # 出身校コード + graduniv_dept_code: str # 出身校学部識別コード + drda_yera: str # 登録年_元号 + drday_year: str # 登録年_年 + medsbj_code1: str # 診療科目1 + medsbj_code2: str # 診療科目2 + medsbj_code3: str # 診療科目3 + medsbj_code4: str # 診療科目4 + medsbj_code5: str # 診療科目5 + dr_addr_lost_code: str # 住所不明 + pref_code: str # 住所コード(県コード) + city_code: str # 住所コード(市区町村コード) + addr_code1: str # 住所コード(大字・通称コード) + addr_code2: str # 住所コード(字・丁目コード) + dr_zip_code: str # 郵便番号 + dr_addr: str # 自宅住所(漢字) + dr_addr_kana: str # 自宅住所(カナ) + dr_addr_num: str # 住所表示番号 + dr_addr_kanj_cnt1: str # 住所カウント_漢字(県) + dr_addr_kanj_cnt2: str # 住所カウント_漢字(市区町村) + dr_addr_kanj_cnt3: str # 住所カウント_漢字(大字・通称) + dr_addr_kanj_cnt4: str # 住所カウント_漢字(字・丁目) + dr_addr_kana_cnt1: str # 住所カウント_カナ(県) + dr_addr_kana_cnt2: str # 住所カウント_カナ(市区町村) + dr_addr_kana_cnt3: str # 住所カウント_カナ(大字・通称) + dr_addr_kana_cnt4: str # 住所カウント_カナ(字・丁目) + dr_tel: str # 自宅電話番号 + use_stop_flag: str # 利用停止区分 + use_stopc_ode: str # 利用停止理由 + cre_stop_date: str # 利用停止登録年月日 + release_date: str # 利用停止解除年月日 + pract_class_code: str # 開勤区分 + pract_yearera: str # 開業年(元号) + pract_year: str # 開業年(年) + bskregst_flag: str # 一括登録フラグ + + dcf_pcf_dr_cd: str # DCFPCF医師コード + addr_village_cd: str # 住所(町字)コード + addr_cnt_kana: str # 住所カウントカナ + addr_cnt: str # 住所カウント + opp_dup_code: str # 相手先重複コード + + birth_day: str # 生年月日(西暦) + estab_y: str # 開業年(西暦) + grad_y: str # 卒業年(西暦) + drday_y: str # 登録年(西暦) + + era_cd: str # 元号コード + + # 住所(集合項目) + address_aggregation_items: list + + # 診療科目(集合項目) + medsbj_code_items: list + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfdr_id = record[1] + self.dcfdr_code = record[2] + self.dcfd_yobi = record[3].strip() + self.maint_flag = record[4] + self.maint_date = record[5] + self.trn_date = record[6] + self.drdel_code = record[7].strip() + self.reptdr_id = record[8].strip() + self.reptdr_code = record[9].strip() + self.reptdr_yobi = record[10].strip() + self.dr_name = record[11].strip() + self.dr_name_kana = record[12].strip() + self.sex_code = record[13].strip() + self.birthday_era = record[14].strip() + self.birthday_year = record[15].strip() + self.birthday_month = record[16].strip() + self.birthday_day = record[17].strip() + self.home_town_code = record[18].strip() + self.medassoci_code = record[19].strip() + self.grad_yearera = record[20].strip() + self.grad_year = record[21].strip() + self.graduniv_code = record[22].strip() + self.graduniv_dept_code = record[23].strip() + self.drda_yera = record[24].strip() + self.drday_year = record[25].strip() + self.medsbj_code1 = record[26].strip() + self.medsbj_code2 = record[27].strip() + self.medsbj_code3 = record[28].strip() + self.medsbj_code4 = record[29].strip() + self.medsbj_code5 = record[30].strip() + self.dr_addr_lost_code = record[31].strip() + self.pref_code = record[32].strip() + self.city_code = record[33].strip() + self.addr_code1 = record[34].strip() + self.addr_code2 = record[35].strip() + self.dr_zip_code = record[36].strip() + self.dr_addr = record[37].strip() + self.dr_addr_kana = record[38].strip() + self.dr_addr_num = record[39] + self.dr_addr_kanj_cnt1 = record[40] + self.dr_addr_kanj_cnt2 = record[41] + self.dr_addr_kanj_cnt3 = record[42] + self.dr_addr_kanj_cnt4 = record[43] + self.dr_addr_kana_cnt1 = record[44] + self.dr_addr_kana_cnt2 = record[45] + self.dr_addr_kana_cnt3 = record[46] + self.dr_addr_kana_cnt4 = record[47] + self.dr_tel = record[48].strip() + self.use_stop_flag = record[49].strip() + self.use_stopc_ode = record[50].strip() + self.cre_stop_date = record[51].strip() + self.release_date = record[52].strip() + self.pract_class_code = record[53].strip() + self.pract_yearera = record[54].strip() + self.pract_year = record[55].strip() + self.bskregst_flag = record[56].strip() + + # DCFPCF医師コード + self.dcf_pcf_dr_cd = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfd_yobi]) + # 住所(町字)コード + self.addr_village_cd = ''.join([self.pref_code, self.city_code, self.addr_code1, self.addr_code2]) + # 住所カウントカナ + self.addr_cnt_kana = ''.join([self.dr_addr_kana_cnt1.zfill(2), self.dr_addr_kana_cnt2.zfill(2), self.dr_addr_kana_cnt3.zfill(2), self.dr_addr_kana_cnt4.zfill(2)]) + # 住所カウント + self.addr_cnt = ''.join([self.dr_addr_kanj_cnt1.zfill(2), self.dr_addr_kanj_cnt2.zfill(2), self.dr_addr_kanj_cnt3.zfill(2), self.dr_addr_kanj_cnt4.zfill(2)]) + # 相手先重複コード + self.opp_dup_code = ''.join([self.reptdr_id, self.reptdr_code, self.reptdr_yobi]) + + self.birth_day = '' # 生年月日(西暦) + self.estab_y = '' # 開業年(西暦) + self.grad_y = '' # 卒業年(西暦) + self.drday_y = '' # 登録年(西暦) + self.era_cd = '' # 元号コード + + # 住所(集合項目) + self.address_aggregation_items = [ + self.pref_code, + self.city_code, + self.addr_code1, + self.addr_code2, + self.dr_zip_code, + self.dr_addr_kana, + self.dr_addr_num, + self.dr_addr_kanj_cnt1, + self.dr_addr_kanj_cnt2, + self.dr_addr_kanj_cnt3, + self.dr_addr_kanj_cnt4, + self.dr_addr_kana_cnt1, + self.dr_addr_kana_cnt2, + self.dr_addr_kana_cnt3, + self.dr_addr_kana_cnt4 + ] + + # 診療科目(集合項目) + self.medsbj_code_items = [ + self.medsbj_code1, + self.medsbj_code2, + self.medsbj_code3, + self.medsbj_code4, + self.medsbj_code5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py new file mode 100644 index 00000000..c2e44d8e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py @@ -0,0 +1,28 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDrSosiety(UltmarcTable): + """レイアウト区分521: COM_所属学会""" + dcf_dr_id: str # レコードID + dcf_dr_code: str # 個人コード + dcf_dr_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + sosiety_cd: str # 学会コード + cont_flag: str # 予備/所属学会メンテ区分 + sosiety_f: str # 学会年度 + dcf_pcf_dr_cd: str # DCFPCF医師コード + +# メンテナンス年月日 と 予備/転送年月日 は未使用 + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcf_dr_id = record[1] + self.dcf_dr_code = record[2] + self.dcf_dr_yobi = record[3].strip() + self.maint_flag = record[4] + self.sosiety_cd = record[5] + self.cont_flag = record[6] + self.sosiety_f = record[9] + + # DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備)) + self.dcf_pcf_dr_cd = ''.join([self.dcf_dr_id, self.dcf_dr_code, self.dcf_dr_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py new file mode 100644 index 00000000..421357b9 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py @@ -0,0 +1,49 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDrWrkplace(UltmarcTable): + """レイアウト区分502 :COM_医師勤務先""" + maint_flag: str # 修正区分 + dcfdr_id: str # 個人コード(ID) + dcfdr_code: str # 個人コード(個人コード) + dcfdr_yobi: str # 個人コード(予備) + hp_id: str # 施設コード(ID) + hp_code: str # 施設コード(施設コード) + hp_yobi: str # 施設コード(予備) + drretflag: str # 予備/退職異動区分 + maintdate: str # メンテナンス年月日 + trndate: str # 予備/転送年月日 + postcode: str # 役職コード + identitycode: str # 大学職位 + sectcode: str # 所属部科コード + sectname: str # 所属部科(漢字) + sectname_kana: str # 所属部科(カナ) + notdm_flg: str # DM不可フラグ + full_dcfdr_code: str # 個人ID+個人コード+個人コード予備 + full_hp_code: str # 施設ID+施設コード+施設コード予備 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maintflag = record[4] + self.dcfdr_id = record[1] + self.dcfdr_code = record[2] + self.dcfdr_yobi = record[3].strip() + self.hp_id = record[5] + self.hp_code = record[6] + self.hp_yobi = record[7].strip() + self.drretflag = record[8] + self.maintdate = record[9] + self.trndate = record[10] + self.postcode = record[11].strip() + self.identitycode = record[12].strip() + + # 所属部科の集合項目 + self.sectcode = record[13].strip() + self.sectname = record[14].strip() + self.sectname_kana = record[15].strip() + + self.notdm_flg = record[16].strip() + + # ID、コード、予備を結合してフル桁コードに変換 + self.full_dcfdr_code = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfdr_yobi]) + self.full_hp_code = ''.join([self.hp_id, self.hp_code, self.hp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py new file mode 100644 index 00000000..a7559d0e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComForfrontMedEquip(UltmarcTable): + """レイアウト区分022: COM_先端医療機器""" + hi_medicmach_code: str # 先進医療機器コード + hi_medicmach_name: str # 先端医療機器名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.hi_medicmach_code = record[1] + self.hi_medicmach_name = record[5] + self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py new file mode 100644 index 00000000..0eb5ab1c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py @@ -0,0 +1,16 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComHamtec(UltmarcTable): + """レイアウト区分021: COM_高度先進医療""" + maint_flag: str # 修正区分 + hamtec_cd: str # 高度先進医療コード + hamtec_div: str # 高度先進医療区分 + hamtec_name: str # 高度先進医療名 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[3] + self.hamtec_cd = record[1] + self.hamtec_div = record[2] + self.hamtec_name = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py new file mode 100644 index 00000000..e47e6513 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComHpAssrt(UltmarcTable): + """レイアウト区分002: 病院種別""" + hp_assrt_cd: str # 病院種別コード + hp_assrt_name: str # 病院種別名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.hp_assrt_cd = record[1] + self.maint_flag = record[2] + self.hp_assrt_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py new file mode 100644 index 00000000..167480d2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -0,0 +1,230 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInst(UltmarcTable): + """レイアウト区分101: COM_施設""" + dcfhp_id: str # 施設コード(レコードID) + dcfhp_code: str # 施設コード(施設コード) + dcfh_yobi: str # 施設コード(予備) + maint_flag: str # 修正区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + uncheck_flag: str # 未確認フラグ + hpdel_code: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_code: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + pref_code: str # 住所コード(県コード) + city_code: str # 住所コード(市区町村コード) + addr_code1: str # 住所コード(大字・通称コード) + addr_code2: str # 住所コード(字・丁目コード) + hp_zip_code: str # 郵便番号 + hp_addr: str # 住所(漢字) + hp_addr_kana: str # 住所(カナ) + hp_addr_number: str # 住所表示番号 + dr_addr_kanji1: str # 住所カウント_漢字(県) + dr_addr_kanji2: str # 住所カウント_漢字(市区町村) + dr_addr_kanji3: str # 住所カウント_漢字(大字・通称) + dr_addr_kanji4: str # 住所カウント_漢字(字・丁目) + dr_addr_kana1: str # 住所カウント_カナ(県) + dr_addr_kana2: str # 住所カウント_カナ(市区町村) + dr_addr_kana3: str # 住所カウント_カナ(大字・通称) + dr_addr_kana4: str # 住所カウント_カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + hp_tel: str # 電話番号 + mgt_class_code: str # 経営体 + hp_class_code: str # 施設区分 + president_id: str # 代表者コード(レコードID) + president_code: str # 代表者コード(個人コード) + president_yobi: str # 代表者コード(予備) + president: str # 代表者(漢字) + president_kana: str # 代表者(カナ) + open_flag: str # 開業予定フラグ + open_year_month: str # 開業予定年月 + close_flag: str # 休院フラグ + close_year_month: str # 休院開始年月 + medsbj_code: list # 診療科目1~60 + hp_kind_code: str # 病院種別 + reexam_flag: str # 再審査区分 + assoc_parrent_id: str # 関連大学親コード(レコードID) + assoc_parrent_code: str # 関連大学親コード(施設コード) + assoc_parrent_yobi: str # 関連大学親コード(予備) + close_flag2: str # 病棟閉鎖フラグ + bed_num: str # 病床数(定員) + bed_class_maint_date: str # 許可病床メンテ日付 + bed_num_sum: str # 許可病床数_合計 + bed_num_psy: str # 許可病床数_精神 + bed_num_tub: str # 許可病床数_結核 + bed_num_epi: str # 許可病床数_感染症 + bed_num_gen: str # 許可病床数_その他 + bed_num_gen2: str # 許可病床数_一般病床 + bed_num_rest: str # 許可病床数_療養病床 + inspect_code1: str # 検査項目_微生物 + inspect_code2: str # 検査項目_血清 + inspect_code3: str # 検査項目_血液 + inspect_code4: str # 検査項目_病理 + inspect_code5: str # 検査項目_寄生虫 + inspect_code6: str # 検査項目_生化 + inspect_code7: str # 検査項目_RI + dcfhp_92id: str # 特養医務室コード(レコードID) + dcfhp_92code: str # 特養医務室コード(施設コード) + dcfhp_92yobi: str # 特養医務室コード(予備) + + dcfdsf_inst_code: str # DCFDSF施設コード + univ_prnt_code: str # 関連大学親コード + inst_repre_code: str # 施設代表者コード + village_code: str # 町字コード + addr_cnt_kana: str # 住所カウントカナ + addr_cnt: str # 住所カウント + dup_opp_code: str # 重複時相手先コード + dcf_prnt_inst_code: str # DCF親施設コード + + prmit_bed: list # 許可ベッド(集合項目) + insp_item: list # 検査項目(集合項目) + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfh_yobi = record[3].strip() + self.maint_flag = record[4] + self.maint_date = record[5] + self.trn_date = record[6] + self.uncheck_flag = record[7].strip() + self.hpdel_code = record[8].strip() + self.duphp_id = record[9] + self.duphp_code = record[10].strip() + self.duphp_yobi = record[11].strip() + self.hp_name = record[12].strip() + self.hp_name_kana = record[13].strip() + self.hp_ryaku_name = record[14].strip() + self.hp_ryaku_name_kana = record[15].strip() + self.hp_addr_lost_code = record[16].strip() + self.pref_code = record[17].strip() + self.city_code = record[18].strip() + self.addr_code1 = record[19].strip() + self.addr_code2 = record[20].strip() + self.hp_zip_code = record[21].strip() + self.hp_addr = record[22] + self.hp_addr_kana = record[23] + self.hp_addr_number = record[24] + self.dr_addr_kanji1 = record[25].strip() + self.dr_addr_kanji2 = record[26].strip() + self.dr_addr_kanji3 = record[27].strip() + self.dr_addr_kanji4 = record[28].strip() + self.dr_addr_kana1 = record[29].strip() + self.dr_addr_kana2 = record[30].strip() + self.dr_addr_kana3 = record[31].strip() + self.dr_addr_kana4 = record[32].strip() + self.tel_nothing_flag = record[33].strip() + self.hp_tel = record[34].strip() + self.mgt_class_code = record[35].strip() + self.hp_class_code = record[36].strip() + self.president_id = record[37] + self.president_code = record[38].strip() + self.president_yobi = record[39] + self.president = record[40].strip() + self.president_kana = record[41].strip() + self.open_flag = record[42].strip() + self.open_year_month = record[43].strip() + self.close_flag = record[44].strip() + self.close_year_month = record[45].strip() + + # 診療科目1~60(csvカラム番号 46 ~ 105) + # rangeの第2引数の数字はループに含まれないため、+1を指定する + self.medsbj_code = [] + for i in range(46, 106): + self.medsbj_code.append(str(record[i])) + + self.hp_kind_code = record[106].strip() + self.reexam_flag = record[107].strip() + self.assoc_parrent_id = record[108].strip() + self.assoc_parrent_code = record[109].strip() + self.assoc_parrent_yobi = record[110].strip() + self.close_flag2 = record[111].strip() + self.bed_num = record[112].strip() + self.bed_class_maint_date = record[113].strip() + self.bed_num_sum = record[114].strip() + self.bed_num_psy = record[115].strip() + self.bed_num_tub = record[116].strip() + self.bed_num_epi = record[117].strip() + self.bed_num_gen = record[118].strip() + self.bed_num_gen2 = record[119].strip() + self.bed_num_rest = record[120].strip() + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.bed_num = self.bed_num if len(self.bed_num) > 0 else None + self.bed_num_sum = self.bed_num_sum if len(self.bed_num_sum) > 0 else None + self.bed_num_psy = self.bed_num_psy if len(self.bed_num_psy) > 0 else None + self.bed_num_tub = self.bed_num_tub if len(self.bed_num_tub) > 0 else None + self.bed_num_epi = self.bed_num_epi if len(self.bed_num_epi) > 0 else None + self.bed_num_gen = self.bed_num_gen if len(self.bed_num_gen) > 0 else None + self.bed_num_gen2 = self.bed_num_gen2 if len(self.bed_num_gen2) > 0 else None + self.bed_num_rest = self.bed_num_rest if len(self.bed_num_rest) > 0 else None + + self.inspect_code1 = record[121].strip() + self.inspect_code2 = record[122].strip() + self.inspect_code3 = record[123].strip() + self.inspect_code4 = record[124].strip() + self.inspect_code5 = record[125].strip() + self.inspect_code6 = record[126].strip() + self.inspect_code7 = record[127].strip() + self.dcfhp_92id = record[128].strip() + self.dcfhp_92code = record[129].strip() + self.dcfhp_92yobi = record[130].strip() + + # 住所カウント_漢字の0埋め + self.dr_addr_kanji1 = self.dr_addr_kanji1.zfill(2) + self.dr_addr_kanji2 = self.dr_addr_kanji2.zfill(2) + self.dr_addr_kanji3 = self.dr_addr_kanji3.zfill(2) + self.dr_addr_kanji4 = self.dr_addr_kanji4.zfill(2) + + # 住所カウント_カナの0埋め + self.dr_addr_kana1 = self.dr_addr_kana1.zfill(2) + self.dr_addr_kana2 = self.dr_addr_kana2.zfill(2) + self.dr_addr_kana3 = self.dr_addr_kana3.zfill(2) + self.dr_addr_kana4 = self.dr_addr_kana4.zfill(2) + + # DCFDSF施設コード + self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi + # 関連大学親コード + self.univ_prnt_code = self.assoc_parrent_id + self.assoc_parrent_code + self.assoc_parrent_yobi + # 施設代表者コード + self.inst_repre_code = self.president_id + self.president_code + self.president_yobi + # 町字コード + self.village_code = self.pref_code + self.city_code + self.addr_code1 + self.addr_code2 + # 住所カウントカナ + self.addr_cnt_kana = self.dr_addr_kana1 + self.dr_addr_kana2 + self.dr_addr_kana3 + self.dr_addr_kana4 + # 住所カウント + self.addr_cnt = self.dr_addr_kanji1 + self.dr_addr_kanji2 + self.dr_addr_kanji3 + self.dr_addr_kanji4 + # 重複時相手先コード + self.dup_opp_code = self.duphp_id + self.duphp_code + self.duphp_yobi + # DCF親施設コード + self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi + + # 許可ベッド(集合項目) + self.prmit_bed = [ + self.bed_num_sum, + self.bed_num_psy, + self.bed_num_tub, + self.bed_num_epi, + self.bed_num_gen, + self.bed_num_gen2, + self.bed_num_rest + ] + + # 検査項目(集合項目) + self.insp_item = [ + self.inspect_code1, + self.inspect_code2, + self.inspect_code3, + self.inspect_code4, + self.inspect_code5, + self.inspect_code6, + self.inspect_code7 + ] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py new file mode 100644 index 00000000..695b247f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py @@ -0,0 +1,703 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInstAtt(UltmarcTable): + """レイアウト区分111: COM_施設属性""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備)10/8asa + dpc_flag: str # DPC対象病院フラグ + dpc_spec_day: str # DPC対象病院指定年月日 + dpc_cancel_day: str # DPC対象病院取消年月日 + predpc_flag: str # DPC準備病院フラグ + predpc_spec_day: str # DPC準備病院承認年 + predpc_cancel_day: str # DPC準備病院取消年月日 + cancer_flag: str # がん診療連携拠点病院フラグ + cancer_spec_day: str # がん診療連携拠点病院指定年月日 + cancer_cancel_day: str # がん診療連携拠点病院取消年月日 + funchp_flag: str # 特定機能病院フラグ + funchp_ok_date: str # 特定機能病院承認年月日 + funchp_can_date: str # 特定機能病院取消年月日 + areasuphp_flag: str # 地域医療支援病院フラグ + areasuphp_intrate: str # 地域医療支援病院紹介率 + areasuphp_ok_date: str # 地域医療支援病院承認年月日 + areasuphp_can_date: str # 地域医療支援病院取消年月日 + acuthp_add_flag: str # 超急性期脳卒中加算フラグ + acuthp_add_ok_date: str # 超急性期脳卒中加算承認年月日 + acuthp_add_can_date: str # 超急性期脳卒中加算取消年月日 + genadmisiion_flag: str # 総合入院体制加算フラグ + genadmisiion_ok_date: str # 総合入院体制加算承認年月日 + genadmisiion_can_date: str # 総合入院体制加算取消年月日 + assistance_flag: str # 医師事務作業補助体制加算フラグ + assistance_ok_date: str # 医師事務作業補助体制加算承認年月日 + assistance_can_date: str # 医師事務作業補助体制加算取消年月日 + diagnosis_treatment_flag: str # 診療録管理体制加算フラグ + diagnosis_treatment_spec_day: str # 診療録管理体制加算承認年月日 + diagnosis_treatment_cancel_day: str # 診療録管理体制加算取消年月日 + safety_flag: str # 医療安全対策加算フラグ + safety_spec_day: str # 医療安全対策加算承認年月日 + safety_cancel_day: str # 医療安全対策加算取消年月日 + highrisk_flag: str # 褥瘡ハイリスク患者ケア加算フラグ + highrisk_spec_day: str # 褥瘡ハイリスク患者ケア加算承認年月日 + highrisk_cancel_day: str # 褥瘡ハイリスク患者ケア加算取消年月日 + infant_and_holiday_flag: str # 地域連携小児夜間・休日診療料フラグ + infant_and_holiday_spec_day: str # 地域連携小児夜間・休日診療料承認 + infant_and_holiday_cancel_day: str # 地域連携小児夜間・休日診療料取消 + ophp_flag: str # 開放型病院フラグ + ophpok_date: str # 開放型病院承認年月日 + ophpcan_date: str # 開放型病院取消年月日 + critical_flag: str # 地域連携クリティカルパスフラグ + critical_code01: str # 地域連携クリティカルパスコード1 + critical_code02: str # 地域連携クリティカルパスコード2 + critical_code03: str # 地域連携クリティカルパスコード3 + critical_code04: str # 地域連携クリティカルパスコード4 + critical_code05: str # 地域連携クリティカルパスコード5 + critical_code06: str # 地域連携クリティカルパスコード6 + critical_code07: str # 地域連携クリティカルパスコード7 + critical_code08: str # 地域連携クリティカルパスコード8 + critical_code09: str # 地域連携クリティカルパスコード9 + critical_code10: str # 地域連携クリティカルパスコード10 + critical_code11: str # 地域連携クリティカルパスコード11 + critical_code12: str # 地域連携クリティカルパスコード12 + critical_code13: str # 地域連携クリティカルパスコード13 + critical_code14: str # 地域連携クリティカルパスコード14 + critical_code15: str # 地域連携クリティカルパスコード15 + critical_code16: str # 地域連携クリティカルパスコード16 + critical_code17: str # 地域連携クリティカルパスコード17 + critical_code18: str # 地域連携クリティカルパスコード18 + critical_code19: str # 地域連携クリティカルパスコード19 + critical_code20: str # 地域連携クリティカルパスコード20 + drgmgthp_flag: str # 薬剤管理指導料フラグ + drgmgthp_ok_date: str # 薬剤管理指導料承認年月日 + drgmgthp_can_date: str # 薬剤管理指導料取消年月日 + image_diagnosis_flag: str # 画像診断管理加算フラグ + image_diagnosis_specified_day: str # 画像診断管理加算承認年月日 + image_diagnosis_cancel_day: str # 画像診断管理加算取消年月日 + chemotherapy_flag: str # 外来化学療法加算フラグ + chemotherapy_spec_day: str # 外来化学療法加算承認年月日 + chemotherapy_cancel_day: str # 外来化学療法加算取消年月日 + rehabilitation_flag: str # 疾患別リハビリテーション料フラグ + rehabilitation_code01: str # 疾患別リハビリテーション料コード1 + rehabilitation_code02: str # 疾患別リハビリテーション料コード2 + rehabilitation_code03: str # 疾患別リハビリテーション料コード3 + rehabilitation_code04: str # 疾患別リハビリテーション料コード4 + rehabilitation_code05: str # 疾患別リハビリテーション料コード5 + rehabilitation_code06: str # 疾患別リハビリテーション料コード6 + rehabilitation_code07: str # 疾患別リハビリテーション料コード7 + rehabilitation_code08: str # 疾患別リハビリテーション料コード8 + rehabilitation_code09: str # 疾患別リハビリテーション料コード9 + rehabilitation_code10: str # 疾患別リハビリテーション料コード10 + anesthetizing_manage_flag: str # 麻酔管理料フラグ + anesthetizing_manage_spec_day: str # 麻酔管理料承認年月日 + anesthetizing_manage_can_day: str # 麻酔管理料取消年月日 + home_recuperation_flag: str # 在宅療養支援病院・診療所フラグ + home_recuperation_spec_day: str # 在宅療養支援病院・診療所承認年月 + home_recuperation_cancel_day: str # 在宅療養支援病院・診療所取消年月 + synthesis_when_staying_flag: str # 在宅時医学総合管理料フラグ + synthesis_when_staying_spec_day: str # 在宅時医学総合管理料承認年月日 + synthesis_when_staying_can_day: str # 在宅時医学総合管理料取消年月日 + home_late_flag: str # 在宅末期医療総合診療料フラグ + home_late_ok_day: str # 在宅末期医療総合診療料承認年月日 + home_late_can_day: str # 在宅末期医療総合診療料取消年月日 + caremix_kind: str # ケアミックス区分 + fullmove_flag: str # 完全型・移行型区分 + resthp_flag: str # 療養型病床群フラグ + resthp_care_kind: str # 療養型病床群_医療型(看護種別) + resthp_bed_num: str # 療養型病床群_医療型(病床数) + resthp_ok_date: str # 療養型病床群_医療型(承認年月日) + resthp_can_date: str # 療養型病床群_医療型(取消年月日) + resthp_care_nrs_kind: str # 療養型病床群_介護型(看護種別) + resthp_care_bed_num: str # 療養型病床群_介護型(病床数) + resthp_care_ok_date: str # 療養型病床群_介護型(承認年月日) + resthp_care_can_date: str # 療養型病床群_介護型(取消年月日) + resthp_sbed_num: str # 療養型病床群_稼動数合計(病床数) + nrmhp_flag: str # 一般病棟フラグ + nrmhp_care_kind: str # 一般病棟看護種別 + nrmhp_bed_total_num: str # 一般病棟病床数 + menthp_flag: str # 精神病棟フラグ + menthp_care_kind: str # 精神病棟看護種別 + menthp_bed_num: str # 精神病棟病床数 + tubhp_flag: str # 結核病棟フラグ + tubhp_care_kind: str # 結核病棟看護種別 + tubhp_bed_num: str # 結核病棟病床数 + infhp_flag: str # 感染症特定 + infhp_flag1: str # 感染症1種 + infhp_flag2: str # 感染症2種 + infhp_bed_flag: str # 感染症病床フラグ + infhp_bed_num: str # 感染症病床病床数 + hospice_flag: str # 緩和ケア病棟設置病院フラグ + hospice_bed_num: str # 緩和ケア病棟設置病院病床数 + hospice_ok_date: str # 緩和ケア病棟設置病院承認年月日 + hospice_can_date: str # 緩和ケア病棟設置病院取消年月日 + hpfunce_st_flag: str # 医療機能評価フラグ + hpfunce_st_kind: str # 医療機能評価種別 + hpfunce_st_ok_date: str # 医療機能評価承認年月日 + hpfunce_st_can_date: str # 医療機能評価取消年月日 + clolyhp_kind: str # 臨床研修指定病院_基幹型病院1フラグ + clolyhp_ok_date: str # 臨床研修指定病院_基幹型病院1承認年月日 + clolyhp_can_date: str # 臨床研修指定病院_基幹型病院1取消年月日 + clhp_kind: str # 臨床研修指定病院_基幹型病院2(群指定)フラグ + clhp_ok_date: str # 臨床研修指定病院_基幹型病院2(群指定)承認 + clhp_can_date: str # 臨床研修指定病院_基幹型病院2(群指定)取消 + cldephp_kind: str # 臨床研修指定病院_協力型病院(群指定)フラグ + cldephp_ok_date: str # 臨床研修指定病院_協力型病院(群指定)承認年 + cldephp_can_date: str # 臨床研修指定病院_協力型病院(群指定)取消年 + disasthp_flag: str # 災害拠点病院 + d1emerhp_flag: str # 救急医療救急告示 + d2emerhp_flag: str # 救急医療2次救急 + d3emerhp_flag: str # 救急医療3次救急 + emergency_clinic: str # 救急告示診療所 + trial_core_flag: str # 治験中核病院フラグ + trial_core_div: str # 治験中核病院区分 + trial_core_ok_date: str # 治験中核病院承認年月日 + trial_core_can_date: str # 治験中核病院取消年月日 + dementia_flag: str # 認知症疾患医療センターフラグ + dementia_okd_ate: str # 認知症疾患医療センター承認年月日 + dementia_can_date: str # 認知症疾患医療センター取消年月日 + sphealth_exploration: str # 特定健康診査実施機 + sphealth_guidance: str # 特定保健指導実施機 + hiadhp_flag: str # 先端医療・高度医療技術実施医療機関フラグ + hiadhpcode1: str # 先端医療・高度医療技術実施医療機関1(コード) + hiadhpkind1: str # 先端医療・高度医療技術実施医療機関1(区分) + hiadhpcode2: str # 先端医療・高度医療技術実施医療機関2(コード) + hiadhpkind2: str # 先端医療・高度医療技術実施医療機関2(区分) + hiadhpcode3: str # 先端医療・高度医療技術実施医療機関3(コード) + hiadhpkind3: str # 先端医療・高度医療技術実施医療機関3(区分) + hiadhpcode4: str # 先端医療・高度医療技術実施医療機関4(コード) + hiadhpkind4: str # 先端医療・高度医療技術実施医療機関4(区分) + hiadhpcode5: str # 先端医療・高度医療技術実施医療機関5(コード) + hiadhpkind5: str # 先端医療・高度医療技術実施医療機関5(区分) + hiadhpcode6: str # 先端医療・高度医療技術実施医療機関6(コード) + hiadhpkind6: str # 先端医療・高度医療技術実施医療機関6(区分) + hiadhpcode7: str # 先端医療・高度医療技術実施医療機関7(コード) + hiadhpkind7: str # 先端医療・高度医療技術実施医療機関7(区分) + hiadhpcode8: str # 先端医療・高度医療技術実施医療機関8(コード) + hiadhpkind8: str # 先端医療・高度医療技術実施医療機関8(区分) + hiadhpcode9: str # 先端医療・高度医療技術実施医療機関9(コード) + hiadhpkind9: str # 先端医療・高度医療技術実施医療機関9(区分) + hiadhpcode10: str # 先端医療・高度医療技術実施医療機関10(コード) + hiadhpkind10: str # 先端医療・高度医療技術実施医療機関10(区分) + hiadhpcode11: str # 先端医療・高度医療技術実施医療機関11(コード) + hiadhpkind11: str # 先端医療・高度医療技術実施医療機関11(区分) + hiadhpcode12: str # 先端医療・高度医療技術実施医療機関12(コード) + hiadhpkind12: str # 先端医療・高度医療技術実施医療機関12(区分) + hiadhpcode13: str # 先端医療・高度医療技術実施医療機関13(コード) + hiadhpkind13: str # 先端医療・高度医療技術実施医療機関13(区分) + hiadhpcode14: str # 先端医療・高度医療技術実施医療機関14(コード) + hiadhpkind14: str # 先端医療・高度医療技術実施医療機関14(区分) + hiadhpcode15: str # 先端医療・高度医療技術実施医療機関15(コード) + hiadhpkind15: str # 先端医療・高度医療技術実施医療機関15(区分) + hiadhpcode16: str # 先端医療・高度医療技術実施医療機関16(コード) + hiadhpkind16: str # 先端医療・高度医療技術実施医療機関16(区分) + hiadhpcode17: str # 先端医療・高度医療技術実施医療機関17(コード) + hiadhpkind17: str # 先端医療・高度医療技術実施医療機関17(区分) + hiadhpcode18: str # 先端医療・高度医療技術実施医療機関18(コード) + hiadhpkind18: str # 先端医療・高度医療技術実施医療機関18(区分) + hiadhpcode19: str # 先端医療・高度医療技術実施医療機関19(コード) + hiadhpkind19: str # 先端医療・高度医療技術実施医療機関19(区分) + hiadhpcode20: str # 先端医療・高度医療技術実施医療機関20(コード) + hiadhpkind20: str # 先端医療・高度医療技術実施医療機関20(区分) + hiadhpcode21: str # 先端医療・高度医療技術実施医療機関21(コード) + hiadhpkind21: str # 先端医療・高度医療技術実施医療機関21(区分) + hiadhpcode22: str # 先端医療・高度医療技術実施医療機関22(コード) + hiadhpkind22: str # 先端医療・高度医療技術実施医療機関22(区分) + hiadhpcode23: str # 先端医療・高度医療技術実施医療機関23(コード) + hiadhpkind23: str # 先端医療・高度医療技術実施医療機関23(区分) + hiadhpcode24: str # 先端医療・高度医療技術実施医療機関24(コード) + hiadhpkind24: str # 先端医療・高度医療技術実施医療機関24(区分) + hiadhpcode25: str # 先端医療・高度医療技術実施医療機関25(コード) + hiadhpkind25: str # 先端医療・高度医療技術実施医療機関25(区分) + hiadhpcode26: str # 先端医療・高度医療技術実施医療機関26(コード) + hiadhpkind26: str # 先端医療・高度医療技術実施医療機関26(区分) + hiadhpcode27: str # 先端医療・高度医療技術実施医療機関27(コード) + hiadhpkind27: str # 先端医療・高度医療技術実施医療機関27(区分) + hiadhpcode28: str # 先端医療・高度医療技術実施医療機関28(コード) + hiadhpkind28: str # 先端医療・高度医療技術実施医療機関28(区分) + hiadhpcode29: str # 先端医療・高度医療技術実施医療機関29(コード) + hiadhpkind29: str # 先端医療・高度医療技術実施医療機関29(区分) + hiadhpcode30: str # 先端医療・高度医療技術実施医療機関30(コード) + hiadhpkind30: str # 先端医療・高度医療技術実施医療機関30(区分) + hiadhpcode31: str # 先端医療・高度医療技術実施医療機関31(コード) + hiadhpkind31: str # 先端医療・高度医療技術実施医療機関31(区分) + hiadhpcode32: str # 先端医療・高度医療技術実施医療機関32(コード) + hiadhpkind32: str # 先端医療・高度医療技術実施医療機関32(区分) + hiadhpcode33: str # 先端医療・高度医療技術実施医療機関33(コード) + hiadhpkind33: str # 先端医療・高度医療技術実施医療機関33(区分) + hiadhpcode34: str # 先端医療・高度医療技術実施医療機関34(コード) + hiadhpkind34: str # 先端医療・高度医療技術実施医療機関34(区分) + hiadhpcode35: str # 先端医療・高度医療技術実施医療機関35(コード) + hiadhpkind35: str # 先端医療・高度医療技術実施医療機関35(区分) + hiadhpcode36: str # 先端医療・高度医療技術実施医療機関36(コード) + hiadhpkind36: str # 先端医療・高度医療技術実施医療機関36(区分) + hiadhpcode37: str # 先端医療・高度医療技術実施医療機関37(コード) + hiadhpkind37: str # 先端医療・高度医療技術実施医療機関37(区分) + hiadhpcode38: str # 先端医療・高度医療技術実施医療機関38(コード) + hiadhpkind38: str # 先端医療・高度医療技術実施医療機関38(区分) + hiadhpcode39: str # 先端医療・高度医療技術実施医療機関39(コード) + hiadhpkind39: str # 先端医療・高度医療技術実施医療機関39(区分) + hiadhpcode40: str # 先端医療・高度医療技術実施医療機関40(コード) + hiadhpkind40: str # 先端医療・高度医療技術実施医療機関40(区分) + hitechhp_flag: str # 先端医療機器フラグ + hitechhpkind1: str # 先端医療機器1 + hitechhpkind2: str # 先端医療機器2 + hitechhpkind3: str # 先端医療機器3 + hitechhpkind4: str # 先端医療機器4 + hitechhpkind5: str # 先端医療機器5 + hitechhpkind6: str # 先端医療機器6 + hitechhpkind7: str # 先端医療機器7 + hitechhpkind8: str # 先端医療機器8 + hitechhpkind9: str # 先端医療機器9 + hitechhpkind10: str # 先端医療機器10 + hitechhpkind11: str # 先端医療機器11 + hitechhpkind12: str # 先端医療機器12 + hitechhpkind13: str # 先端医療機器13 + hitechhpkind14: str # 先端医療機器14 + hitechhpkind15: str # 先端医療機器15 + hitechhpkind16: str # 先端医療機器16 + hitechhpkind17: str # 先端医療機器17 + hitechhpkind18: str # 先端医療機器18 + hitechhpkind19: str # 先端医療機器19 + hitechhpkind20: str # 先端医療機器20 + policy_medical_flag: str # 政策医療フラグ + policymedical_code01: str # 政策医療1(コード) + policymedical_content01: str # 政策医療1(区分) + policymedical_code02: str # 政策医療2(コード) + policymedical_content02: str # 政策医療2(区分) + policymedical_code03: str # 政策医療3(コード) + policymedical_content03: str # 政策医療3(区分) + policymedical_code04: str # 政策医療4(コード) + policymedical_content04: str # 政策医療4(区分) + policymedical_code05: str # 政策医療5(コード) + policymedical_content05: str # 政策医療5(区分) + policymedical_code06: str # 政策医療6(コード) + policymedical_content06: str # 政策医療6(区分) + policymedical_code07: str # 政策医療7(コード) + policymedical_content07: str # 政策医療7(区分) + policymedical_code08: str # 政策医療8(コード) + policymedical_content08: str # 政策医療8(区分) + policymedical_code09: str # 政策医療9(コード) + policymedical_content09: str # 政策医療9(区分) + policymedical_code10: str # 政策医療10(コード) + policymedical_content10: str # 政策医療10(区分) + policymedical_code11: str # 政策医療11(コード) + policymedical_content11: str # 政策医療11(区分) + policymedical_code12: str # 政策医療12(コード) + policymedical_content12: str # 政策医療12(区分) + policymedical_code13: str # 政策医療13(コード) + policymedical_content13: str # 政策医療13(区分) + policymedical_code14: str # 政策医療14(コード) + policymedical_content14: str # 政策医療14(区分) + policymedical_code15: str # 政策医療15(コード) + policymedical_content15: str # 政策医療15(区分) + policymedical_code16: str # 政策医療16(コード) + policymedical_content16: str # 政策医療16(区分) + policymedical_code17: str # 政策医療17(コード) + policymedical_content17: str # 政策医療17(区分) + policymedical_code18: str # 政策医療18(コード) + policymedical_content18: str # 政策医療18(区分) + policymedical_code19: str # 政策医療19(コード) + policymedical_content19: str # 政策医療19(区分) + policymedical_code20: str # 政策医療20(コード) + policymedical_content20: str # 政策医療20(区分) + visitcarest_flag: str # 訪問看護ステーションフラグ + visitcarestation_id: str # 訪問看護ステーション_施設コード(レコードID) + visitcarestation_code: str # 訪問看護ステーション_施設コード(施設コード) + visitcarestation_yobi: str # 訪問看護ステーション_施設コード(予備) + open_date: str # 開設年月 + maint_flag: str # 修正区分 + adddel_div: str # 追加削除区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + resthp_items: list # 療養型病床リスト + cl_items: list # 臨床研修指定病院リスト + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + + self.maint_flag = record[4].strip() + self.adddel_div = record[5].strip() + + self.dpc_flag = record[8].strip() + self.dpc_spec_day = record[9].strip() + self.dpc_cancel_day = record[10].strip() + + self.predpc_flag = record[11].strip() + self.predpc_spec_day = record[12].strip() + self.predpc_cancel_day = record[13].strip() + + self.cancer_flag = record[14].strip() + self.cancer_spec_day = record[15].strip() + self.cancer_cancel_day = record[16].strip() + + self.funchp_flag = record[17].strip() + self.funchp_ok_date = record[18].strip() + self.funchp_can_date = record[19].strip() + + self.areasuphp_flag = record[20].strip() + self.areasuphp_intrate = record[21].strip() + self.areasuphp_ok_date = record[22].strip() + self.areasuphp_can_date = record[23].strip() + + self.acuthp_add_flag = record[24].strip() + self.acuthp_add_ok_date = record[25].strip() + self.acuthp_add_can_date = record[26].strip() + + self.genadmisiion_flag = record[27].strip() + self.genadmisiion_ok_date = record[28].strip() + self.genadmisiion_can_date = record[29].strip() + + self.assistance_flag = record[30].strip() + self.assistance_ok_date = record[31].strip() + self.assistance_can_date = record[32].strip() + + self.diagnosis_treatment_flag = record[33].strip() + self.diagnosis_treatment_spec_day = record[34].strip() + self.diagnosis_treatment_cancel_day = record[35].strip() + + self.safety_flag = record[36].strip() + self.safety_spec_day = record[37].strip() + self.safety_cancel_day = record[38].strip() + + self.highrisk_flag = record[39].strip() + self.highrisk_spec_day = record[40].strip() + self.highrisk_cancel_day = record[41].strip() + + self.infant_and_holiday_flag = record[42].strip() + self.infant_and_holiday_spec_day = record[43].strip() + self.infant_and_holiday_cancel_day = record[44].strip() + + self.ophp_flag = record[45].strip() + self.ophpok_date = record[46].strip() + self.ophpcan_date = record[47].strip() + self.critical_flag = record[48].strip() + + self.critical_code01 = record[49].strip() + self.critical_code02 = record[50].strip() + self.critical_code03 = record[51].strip() + self.critical_code04 = record[52].strip() + self.critical_code05 = record[53].strip() + self.critical_code06 = record[54].strip() + self.critical_code07 = record[55].strip() + self.critical_code08 = record[56].strip() + self.critical_code09 = record[57].strip() + self.critical_code10 = record[58].strip() + self.critical_code11 = record[59].strip() + self.critical_code12 = record[60].strip() + self.critical_code13 = record[61].strip() + self.critical_code14 = record[62].strip() + self.critical_code15 = record[63].strip() + self.critical_code16 = record[64].strip() + self.critical_code17 = record[65].strip() + self.critical_code18 = record[66].strip() + self.critical_code19 = record[67].strip() + self.critical_code20 = record[68].strip() + + self.drgmgthp_flag = record[69].strip() + self.drgmgthp_ok_date = record[70].strip() + self.drgmgthp_can_date = record[71].strip() + + self.image_diagnosis_flag = record[72].strip() + self.image_diagnosis_specified_day = record[73].strip() + self.image_diagnosis_cancel_day = record[74].strip() + + self.chemotherapy_flag = record[75].strip() + self.chemotherapy_spec_day = record[76].strip() + self.chemotherapy_cancel_day = record[77].strip() + + self.rehabilitation_flag = record[78].strip() + self.rehabilitation_code01 = record[79].strip() + self.rehabilitation_code02 = record[80].strip() + self.rehabilitation_code03 = record[81].strip() + self.rehabilitation_code04 = record[82].strip() + self.rehabilitation_code05 = record[83].strip() + self.rehabilitation_code06 = record[84].strip() + self.rehabilitation_code07 = record[85].strip() + self.rehabilitation_code08 = record[86].strip() + self.rehabilitation_code09 = record[87].strip() + self.rehabilitation_code10 = record[88].strip() + + self.anesthetizing_manage_flag = record[89].strip() + self.anesthetizing_manage_spec_day = record[90].strip() + self.anesthetizing_manage_can_day = record[91].strip() + + self.home_recuperation_flag = record[92].strip() + self.home_recuperation_spec_day = record[93].strip() + self.home_recuperation_cancel_day = record[94].strip() + + self.synthesis_when_staying_flag = record[95].strip() + self.synthesis_when_staying_spec_day = record[96].strip() + self.synthesis_when_staying_can_day = record[97].strip() + + self.home_late_flag = record[98].strip() + self.home_late_ok_day = record[99].strip() + self.home_late_can_day = record[100].strip() + + self.caremix_kind = record[101].strip() + self.fullmove_flag = record[102].strip() + + self.resthp_flag = record[103].strip() + self.resthp_care_kind = record[104].strip() + self.resthp_bed_num = record[105].strip() + self.resthp_ok_date = record[106].strip() + self.resthp_can_date = record[107].strip() + self.resthp_care_nrs_kind = record[108].strip() + self.resthp_care_bed_num = record[109].strip() + self.resthp_care_ok_date = record[110].strip() + self.resthp_care_can_date = record[111].strip() + self.resthp_sbed_num = record[112].strip() + + self.nrmhp_flag = record[113].strip() + self.nrmhp_care_kind = record[114].strip() + self.nrmhp_bed_total_num = record[115].strip() + + self.menthp_flag = record[116].strip() + self.menthp_care_kind = record[117].strip() + self.menthp_bed_num = record[118].strip() + + self.tubhp_flag = record[119].strip() + self.tubhp_care_kind = record[120].strip() + self.tubhp_bed_num = record[121].strip() + + self.infhp_flag = record[122].strip() + self.infhp_flag1 = record[123].strip() + self.infhp_flag2 = record[124].strip() + + self.infhp_bed_flag = record[125].strip() + self.infhp_bed_num = record[126].strip() + + self.hospice_flag = record[127].strip() + self.hospice_bed_num = record[128].strip() + self.hospice_ok_date = record[129].strip() + self.hospice_can_date = record[130].strip() + + self.hpfunce_st_flag = record[131].strip() + self.hpfunce_st_kind = record[132].strip() + self.hpfunce_st_ok_date = record[133].strip() + self.hpfunce_st_can_date = record[134].strip() + + self.clolyhp_kind = record[135].strip() + self.clolyhp_ok_date = record[136].strip() + self.clolyhp_can_date = record[137].strip() + self.clhp_kind = record[138].strip() + self.clhp_ok_date = record[139].strip() + self.clhp_can_date = record[140].strip() + self.cldephp_kind = record[141].strip() + self.cldephp_ok_date = record[142].strip() + self.cldephp_can_date = record[143].strip() + + self.disasthp_flag = record[144].strip() + + self.d1emerhp_flag = record[145].strip() + self.d2emerhp_flag = record[146].strip() + self.d3emerhp_flag = record[147].strip() + + self.emergency_clinic = record[148].strip() + + self.trial_core_flag = record[149].strip() + self.trial_core_div = record[150].strip() + self.trial_core_ok_date = record[151].strip() + self.trial_core_can_date = record[152].strip() + + self.dementia_flag = record[153].strip() + self.dementia_okd_ate = record[154].strip() + self.dementia_can_date = record[155].strip() + + self.sphealth_exploration = record[156].strip() + self.sphealth_guidance = record[157].strip() + + self.hiadhp_flag = record[158].strip() + self.hiadhpcode1 = record[159].strip() + self.hiadhpkind1 = record[160].strip() + self.hiadhpcode2 = record[161].strip() + self.hiadhpkind2 = record[162].strip() + self.hiadhpcode3 = record[163].strip() + self.hiadhpkind3 = record[164].strip() + self.hiadhpcode4 = record[165].strip() + self.hiadhpkind4 = record[166].strip() + self.hiadhpcode5 = record[167].strip() + self.hiadhpkind5 = record[168].strip() + self.hiadhpcode6 = record[169].strip() + self.hiadhpkind6 = record[170].strip() + self.hiadhpcode7 = record[171].strip() + self.hiadhpkind7 = record[172].strip() + self.hiadhpcode8 = record[173].strip() + self.hiadhpkind8 = record[174].strip() + self.hiadhpcode9 = record[175].strip() + self.hiadhpkind9 = record[176].strip() + self.hiadhpcode10 = record[177].strip() + self.hiadhpkind10 = record[178].strip() + self.hiadhpcode11 = record[179].strip() + self.hiadhpkind11 = record[180].strip() + self.hiadhpcode12 = record[181].strip() + self.hiadhpkind12 = record[182].strip() + self.hiadhpcode13 = record[183].strip() + self.hiadhpkind13 = record[184].strip() + self.hiadhpcode14 = record[185].strip() + self.hiadhpkind14 = record[186].strip() + self.hiadhpcode15 = record[187].strip() + self.hiadhpkind15 = record[188].strip() + self.hiadhpcode16 = record[189].strip() + self.hiadhpkind16 = record[190].strip() + self.hiadhpcode17 = record[191].strip() + self.hiadhpkind17 = record[192].strip() + self.hiadhpcode18 = record[193].strip() + self.hiadhpkind18 = record[194].strip() + self.hiadhpcode19 = record[195].strip() + self.hiadhpkind19 = record[196].strip() + self.hiadhpcode20 = record[197].strip() + self.hiadhpkind20 = record[198].strip() + self.hiadhpcode21 = record[199].strip() + self.hiadhpkind21 = record[200].strip() + self.hiadhpcode22 = record[201].strip() + self.hiadhpkind22 = record[202].strip() + self.hiadhpcode23 = record[203].strip() + self.hiadhpkind23 = record[204].strip() + self.hiadhpcode24 = record[205].strip() + self.hiadhpkind24 = record[206].strip() + self.hiadhpcode25 = record[207].strip() + self.hiadhpkind25 = record[208].strip() + self.hiadhpcode26 = record[209].strip() + self.hiadhpkind26 = record[210].strip() + self.hiadhpcode27 = record[211].strip() + self.hiadhpkind27 = record[212].strip() + self.hiadhpcode28 = record[213].strip() + self.hiadhpkind28 = record[214].strip() + self.hiadhpcode29 = record[215].strip() + self.hiadhpkind29 = record[216].strip() + self.hiadhpcode30 = record[217].strip() + self.hiadhpkind30 = record[218].strip() + self.hiadhpcode31 = record[219].strip() + self.hiadhpkind31 = record[220].strip() + self.hiadhpcode32 = record[221].strip() + self.hiadhpkind32 = record[222].strip() + self.hiadhpcode33 = record[223].strip() + self.hiadhpkind33 = record[224].strip() + self.hiadhpcode34 = record[225].strip() + self.hiadhpkind34 = record[226].strip() + self.hiadhpcode35 = record[227].strip() + self.hiadhpkind35 = record[228].strip() + self.hiadhpcode36 = record[229].strip() + self.hiadhpkind36 = record[230].strip() + self.hiadhpcode37 = record[231].strip() + self.hiadhpkind37 = record[232].strip() + self.hiadhpcode38 = record[233].strip() + self.hiadhpkind38 = record[234].strip() + self.hiadhpcode39 = record[235].strip() + self.hiadhpkind39 = record[236].strip() + self.hiadhpcode40 = record[237].strip() + self.hiadhpkind40 = record[238].strip() + + self.hitechhp_flag = record[239].strip() + self.hitechhpkind1 = record[240].strip() + self.hitechhpkind2 = record[241].strip() + self.hitechhpkind3 = record[242].strip() + self.hitechhpkind4 = record[243].strip() + self.hitechhpkind5 = record[244].strip() + self.hitechhpkind6 = record[245].strip() + self.hitechhpkind7 = record[246].strip() + self.hitechhpkind8 = record[247].strip() + self.hitechhpkind9 = record[248].strip() + self.hitechhpkind10 = record[249].strip() + self.hitechhpkind11 = record[250].strip() + self.hitechhpkind12 = record[251].strip() + self.hitechhpkind13 = record[252].strip() + self.hitechhpkind14 = record[253].strip() + self.hitechhpkind15 = record[254].strip() + self.hitechhpkind16 = record[255].strip() + self.hitechhpkind17 = record[256].strip() + self.hitechhpkind18 = record[257].strip() + self.hitechhpkind19 = record[258].strip() + self.hitechhpkind20 = record[259].strip() + + self.policy_medical_flag = record[260].strip() + self.policymedical_code01 = record[261].strip() + self.policymedical_content01 = record[262].strip() + self.policymedical_code02 = record[263].strip() + self.policymedical_content02 = record[264].strip() + self.policymedical_code03 = record[265].strip() + self.policymedical_content03 = record[266].strip() + self.policymedical_code04 = record[267].strip() + self.policymedical_content04 = record[268].strip() + self.policymedical_code05 = record[269].strip() + self.policymedical_content05 = record[270].strip() + self.policymedical_code06 = record[271].strip() + self.policymedical_content06 = record[272].strip() + self.policymedical_code07 = record[273].strip() + self.policymedical_content07 = record[274].strip() + self.policymedical_code08 = record[275].strip() + self.policymedical_content08 = record[276].strip() + self.policymedical_code09 = record[277].strip() + self.policymedical_content09 = record[278].strip() + self.policymedical_code10 = record[279].strip() + self.policymedical_content10 = record[280].strip() + self.policymedical_code11 = record[281].strip() + self.policymedical_content11 = record[282].strip() + self.policymedical_code12 = record[283].strip() + self.policymedical_content12 = record[284].strip() + self.policymedical_code13 = record[285].strip() + self.policymedical_content13 = record[286].strip() + self.policymedical_code14 = record[287].strip() + self.policymedical_content14 = record[288].strip() + self.policymedical_code15 = record[289].strip() + self.policymedical_content15 = record[290].strip() + self.policymedical_code16 = record[291].strip() + self.policymedical_content16 = record[292].strip() + self.policymedical_code17 = record[293].strip() + self.policymedical_content17 = record[294].strip() + self.policymedical_code18 = record[295].strip() + self.policymedical_content18 = record[296].strip() + self.policymedical_code19 = record[297].strip() + self.policymedical_content19 = record[298].strip() + self.policymedical_code20 = record[299].strip() + self.policymedical_content20 = record[300].strip() + + self.visitcarest_flag = record[301].strip() + self.visitcarestation_id = record[302].strip() + self.visitcarestation_code = record[303].strip() + self.visitcarestation_yobi = record[304].strip() + + self.open_date = record[305].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfhp_yobi + + # 療養型病床群 + self.resthp_items = [ + self.resthp_flag, + self.resthp_care_kind, + self.resthp_bed_num, + self.resthp_ok_date, + self.resthp_can_date, + self.resthp_care_nrs_kind, + self.resthp_care_bed_num, + self.resthp_care_ok_date, + self.resthp_care_can_date, + self.resthp_sbed_num + ] + + # 臨床研修指定病院リスト + self.cl_items = [ + self.clolyhp_kind, + self.clolyhp_ok_date, + self.clolyhp_can_date, + self.clhp_kind, + self.clhp_ok_date, + self.clhp_can_date, + self.cldephp_kind, + self.cldephp_ok_date, + self.cldephp_can_date + ] + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.areasuphp_intrate = self.areasuphp_intrate if len(self.areasuphp_intrate) > 0 else None + self.resthp_bed_num = self.resthp_bed_num if len(self.resthp_bed_num) > 0 else None + self.resthp_care_bed_num = self.resthp_care_bed_num if len(self.resthp_care_bed_num) > 0 else None + self.resthp_sbed_num = self.resthp_sbed_num if len(self.resthp_sbed_num) > 0 else None + self.nrmhp_bed_total_num = self.nrmhp_bed_total_num if len(self.nrmhp_bed_total_num) > 0 else None + self.menthp_bed_num = self.menthp_bed_num if len(self.menthp_bed_num) > 0 else None + self.tubhp_bed_num = self.tubhp_bed_num if len(self.tubhp_bed_num) > 0 else None + self.infhp_bed_num = self.infhp_bed_num if len(self.infhp_bed_num) > 0 else None + self.hospice_bed_num = self.hospice_bed_num if len(self.hospice_bed_num) > 0 else None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py new file mode 100644 index 00000000..a51e5e3b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInstDiv(UltmarcTable): + """レイアウト区分011: COM_施設区分""" + inst_div_cd: str # 施設区分コード + inst_div_name: str # 施設区分名称 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.inst_div_cd = record[1] + self.maint_flag = record[2] + self.inst_div_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py new file mode 100644 index 00000000..7d3bdefc --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComManage(UltmarcTable): + """レイアウト区分007: COM_経営体""" + manage_cd: str # 経営体コード + manage_name: str # 経営体名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.manage_cd = record[1] + self.maint_flag = record[2] + self.manage_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py new file mode 100644 index 00000000..a1e0e4cc --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py @@ -0,0 +1,24 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedAreaCity(UltmarcTable): + """レイアウト区分124: COM_医療圏都道府県市町村対応表""" + prefc_cd: str # 県コード + med_sphe_cd: str # 医療圏コード + jis_prefc_cd: str # JIS都道府県コード + jis_city_cd: str # JIS市区町村コード + zen_prefcode: str # 移動元2次コード(都道府県) + zen_medareacode: str # 移動元2次コード(医療圏コード) + maintflag: str # 修正区分 + addDelDiv: str # 追加削除区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.prefc_cd = record[1] + self.med_sphe_cd = record[2] + self.maintflag = record[3] + self.jis_prefc_cd = record[4] + self.jis_city_cd = record[5] + self.addDelDiv = record[6] + self.zen_prefcode = record[9].strip() + self.zen_medareacode = record[10].strip() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py new file mode 100644 index 00000000..9eab1f21 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedFuncValuation(UltmarcTable): + """レイアウト区分024: COM_医療機器評価""" + maint_flag: str # 修正区分 + med_func_valuation_cd: str # 医療機器評価コード + med_func_valuation_name: str # 医療機器評価名称(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.med_func_valuation_cd = record[1] + self.med_func_valuation_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py new file mode 100644 index 00000000..e08adc88 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py @@ -0,0 +1,48 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedPrefc(UltmarcTable): + """レイアウト区分121: COM_医療圏都道府県""" + pref_code: str # 都道府県コード + rev_date: str # 医療圏メンテナンス年月日 + post_date: str # 公示年月日 + psy_bednum_tg: str # 精神_基準病床数 or 整備目標数 + psy_bednum_gen: str # 精神_既存病床数(病床数) + psy_bednum_date: str # 精神_既存病床数(年月日) + psy_eqbed_num: str # 精神_過不足病床数(差引) + tb_bednum_tg: str # 結核_基準病床数 or 整備目標数 + tb_bednum_gen: str # 結核_既存病床数(病床数) + tb_bednum_date: str # 結核_既存病床数(年月日) + tb_eqbed_num: str # 結核_過不足病床数(差引) + inf_bednum_tg: str # 感染症_基準病床数 or 整備目標数 + inf_bednum_gen: str # 感染症_既存病床数(病床数) + inf_bednum_date: str # 感染症_既存病床数(年月日) + inf_eqbed_num: str # 感染症_過不足病床数(差引) + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.pref_code = record[1] + self.maintflag = record[2] + self.rev_date = record[5] + self.post_date = record[6] + self.psy_bednum_tg = record[7].strip() + self.psy_bednum_gen = record[8].strip() + self.psy_bednum_date = record[9] + self.psy_eqbed_num = record[10] + self.tb_bednum_tg = record[11].strip() + self.tb_bednum_gen = record[12].strip() + self.tb_bednum_date = record[13] + self.tb_eqbed_num = record[14] + self.inf_bednum_tg = record[15].strip() + self.inf_bednum_gen = record[16].strip() + self.inf_bednum_date = record[17] + self.inf_eqbed_num = record[18] + + # decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.psy_bednum_tg = self.psy_bednum_tg if len(self.psy_bednum_tg) > 0 else None + self.psy_bednum_gen = self.psy_bednum_gen if len(self.psy_bednum_gen) > 0 else None + self.tb_bednum_tg = self.tb_bednum_tg if len(self.tb_bednum_tg) > 0 else None + self.tb_bednum_gen = self.tb_bednum_gen if len(self.tb_bednum_gen) > 0 else None + self.inf_bednum_tg = self.inf_bednum_tg if len(self.inf_bednum_tg) > 0 else None + self.inf_bednum_gen = self.inf_bednum_gen if len(self.inf_bednum_gen) > 0 else None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py new file mode 100644 index 00000000..6a7fdb4e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComNurseAssrt(UltmarcTable): + """レイアウト区分023: COM_看護種別""" + nurse_assrt_cd: str # 看護種別コード + nurse_assrt_name: str # 看護種別名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.nurse_assrt_cd = record[1] + self.nurse_assrt_name = record[5] + self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py new file mode 100644 index 00000000..25e2887f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py @@ -0,0 +1,139 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPharm(UltmarcTable): + """レイアウト区分102: COM_薬局""" + dcfhp_id: str # DCF コード(ID) + dcfhp_code: str # DCF コード(コード) + dcfhp_yobi: str # DCF コード(予備) + maint_flag: str # 修正区分 + maintdate: str # メンテナンス年月日 + pass # 予備/転送年月日(未使用) + unconf_flg: str # 未確認フラグ + del_cd: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_cd: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + prefc_cd: str # 住所コード(県コード) + city_cd: str # 住所コード(市区町村コード) + addrcode1: str # 住所コード(大字・通称コード) + addrcode2: str # 住所コード(字・丁目コード) + zip_code: str # 郵便番号 + addr: str # 住所(漢字) + addr_kana: str # 住所(カナ) + addr_number: str # 住所表示番号 + addrkanjcnt1: str # 住所文字カウント:漢字(県) + addrkanjcnt2: str # 住所文字カウント:漢字(市区町村) + addrkanjcnt3: str # 住所文字カウント:漢字(大字・通称) + addrkanjcnt4: str # 住所文字カウント:漢字(字・丁目) + addrkanacnt1: str # 住所文字カウント:カナ(県) + addrkanacnt2: str # 住所文字カウント:カナ(市区町村) + addrkanacnt3: str # 住所文字カウント:カナ(大字・通称) + addrkanacnt4: str # 住所文字カウント:カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + tel_number: str # 電話番号 + mgtclass_code: str # 経営体 + hpclass_code: str # 施設区分 + president: str # 代表者(漢字) + president_Kana: str # 代表者(カナ) + open_flag: str # 開業予定(フラグ) + open_yearmonth: str # 開業予定(年月) + close_flg: str # 休院(休院フラグ) + close_yearmonth: str # 休院(開始年月) + pharmacist: str # 管理薬剤師名(漢字) + pharmacist_kana: str # 管理薬剤師名(カナ) + franchise_hq_id: str # チェーン店本部コード(レコードID) + franchise_hq_code: str # チェーン店本部コード(施設コード) + franchise_hq_yobi: str # チェーン店本部コード(予備) + + dcfdsf_inst_cd: str # 施設コード + village_code: str # 町字コード + addr_count_kana: str # 住所カウントカナ + addr_count: str # 住所カウント + dup_opp_cd: str # 重複時相手先コード + franchise_hq_cd: str # チェーン店本部コード + + def __init__(self, record: list[str]): + super().__init__(record) + + self.dcfhp_id = record[1] + self.dcfhp_cd = record[2] + self.dcfhp_yobi = record[3] + self.maint_flag = record[4] + self.maintdate = record[5] + self.unconf_flg = record[7].strip() + self.del_cd = record[8].strip() + self.duphp_id = record[9].strip() + self.duphp_cd = record[10].strip() + self.duphp_yobi = record[11].strip() + self.hp_name = record[12].strip() + self.hp_name_kana = record[13].strip() + self.hp_ryaku_name = record[14].strip() + self.hp_ryaku_name_kana = record[15].strip() + self.hp_addr_lost_code = record[16].strip() + self.prefc_cd = record[17].strip() + self.city_cd = record[18].strip() + self.addrcode1 = record[19].strip() + self.addrcode2 = record[20].strip() + self.zip_code = record[21].strip() + self.addr = record[22] + self.addr_kana = record[23] + self.addr_number = record[24] + self.addrkanjcnt1 = record[25].strip() + self.addrkanjcnt2 = record[26].strip() + self.addrkanjcnt3 = record[27].strip() + self.addrkanjcnt4 = record[28].strip() + self.addrkanacnt1 = record[29].strip() + self.addrkanacnt2 = record[30].strip() + self.addrkanacnt3 = record[31].strip() + self.addrkanacnt4 = record[32].strip() + self.tel_nothing_flag = record[33].strip() + self.tel_number = record[34].strip() + self.mgtclass_code = record[35].strip() + self.hpclass_code = record[36].strip() + self.president = record[37].strip() + self.president_Kana = record[38].strip() + self.open_flag = record[39].strip() + self.open_yearmonth = record[40].strip() + self.close_flg = record[41].strip() + self.close_yearmonth = record[42].strip() + self.pharmacist = record[43] + self.pharmacist_kana = record[44] + self.franchise_hq_id = record[45] + self.franchise_hq_code = record[46] + self.franchise_hq_yobi = record[47] + + # 住所カウント_漢字の0埋め + self.addrkanacnt1 = self.addrkanacnt1.zfill(2) + self.addrkanacnt2 = self.addrkanacnt2.zfill(2) + self.addrkanacnt3 = self.addrkanacnt3.zfill(2) + self.addrkanacnt4 = self.addrkanacnt4.zfill(2) + + # 住所カウント_カナの0埋め + self.addrkanjcnt1 = self.addrkanjcnt1.zfill(2) + self.addrkanjcnt2 = self.addrkanjcnt2.zfill(2) + self.addrkanjcnt3 = self.addrkanjcnt3.zfill(2) + self.addrkanjcnt4 = self.addrkanjcnt4.zfill(2) + + # 施設コード(2+3+4) + self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi]) + + # 町字コード(18+19+20+21) + self.village_code = ''.join([self.prefc_cd, self.city_cd, self.addrcode1, self.addrcode2]) + + # 住所カウントカナ(30+31+32+33) + self.addr_count_kana = ''.join([self.addrkanacnt1, self.addrkanacnt2, self.addrkanacnt3, self.addrkanacnt4]) + + # 住所カウント(26+27+28+29) + self.addr_count = ''.join([self.addrkanjcnt1, self.addrkanjcnt2, self.addrkanjcnt3, self.addrkanjcnt4]) + + # 重複時相手先コード(10+11+12) + self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi]) + + # チェーン店本部コード(46+47+48) + self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_code, self.franchise_hq_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py new file mode 100644 index 00000000..ee726ae6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPolicyMed(UltmarcTable): + """レイアウト区分028: COM_政策医療""" + policy_med_cd: str # 政策医療コード + field_name: str # 分野名称(漢字) + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.policy_med_cd = record[1] + self.field_name = record[5] + self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py new file mode 100644 index 00000000..e1095c51 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPost(UltmarcTable): + """レイアウト区分005: COM_役職""" + post_cd: str # 役職コード + form_post_name: str # 正式役職名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.post_cd = record[1] + self.maint_flag = record[2] + self.form_post_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py new file mode 100644 index 00000000..fd9342ff --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py @@ -0,0 +1,157 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedBase(UltmarcTable): + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + maint_flag: str # 修正区分 + adddel_div: str # 予備/追加削除区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + info_date: str # 情報年月日 + home_page: str # 案内用ホームページアドレス + hppre_flg: str # 院内処方フラグ + expre_flg: str # 院外処方フラグ + trial_flg: str # 治験の実施フラグ + trial_cont_count: str # 治験の実施_契約件数 + trial_whet_from: str # 治験の実施_期間自 + trial_whet_to: str # 治験の実施_期間至 + equipment_flg: str # 保有する施設設備フラグ + cos_disease_flg: str # 対応することができる疾患・治療の内容フラグ + cos_surgery: str # 対応することができる短期滞在手術フラグ + specialclinic_flg: str # 専門外来フラグ + establishment_flg: str # 地域医療連携体制_窓口設置フラグ + critical_flg: str # 地域医療連携体制_地域連携パスフラグ + cop_system: str # 入院診療計画策定時における院内の連携体制 + sys_exists_flg: str # オーダリングシステム_有無フラグ + sys_inspection: str # オーダリングシステム_検査 + sys_prescription: str # オーダリングシステム_処方 + sys_reserv: str # オーダリングシステム_予約 + icduse_flg: str # ICDコード利用フラグ + echart_flg: str # 電子カルテフラク + fulltime_flg: str # 専任従事者フラグ + fulltime_count: str # 専任従事者数 + ge_patient_avg: str # 病床患者数平均(一般) + mt_patient_avg: str # 病床患者数平均(療養) + mc_patient_avg: str # 病床患者数平均(療養(医療)) + ca_patient_avg: str # 病床患者数平均(療養(介護)) + pys_patient_avg: str # 病床患者数平均(精神) + tub_patient_avg: str # 病床患者数平均(結核) + inf_patient_avg: str # 病床患者数平均(感染症) + patient_avg_sum: str # 病床患者数平均(全体) + patient_avg_from: str # 病床患者数平均_期間自(病床種別) + patient_avg_to: str # 病床患者数平均_期間至(病床種別) + cl_patient_avg: str # 患者数平均(外来) + cl_patient_avg_from: str # 病床患者数平均_期間自(外来) + cl_patient_avg_to: str # 病床患者数平均_期間至(外来) + hm_patient_avg: str # 患者数平均(在宅) + hm_patient_avg_from: str # 病床患者数平均_期間自(在宅) + hm_patient_avg_to: str # 病床患者数平均_期間至(在宅) + ge_patient_ex: str # 患者数延数(一般) + mt_patient_ex: str # 患者数延数(療養) + mc_patient_ex: str # 病床患者数平均(療養(医療)) + ca_patient_ex: str # 病床患者数平均(療養(介護)) + pys_patient_ex: str # 患者数延数(精神) + tub_patient_ex: str # 患者数延数(結核) + inf_patient_ex: str # 患者数延数(感染症) + patient_ex_sum: str # 患者数延数(全体) + patient_ex_from: str # 患者数延数_期間自(病床種別) + patient_ex_to: str # 患者数延数_期間至(病床種別) + cl_patient_ex: str # 患者数延数(外来) + cl_patient_ex_from: str # 患者数延数_期間自(外来) + cl_patient_ex_to: str # 患者数延数_期間至(外来) + hm_patient_ex: str # 患者数延数(在宅) + hm_patient_ex_from: str # 患者数延数_期間自(在宅) + hm_patient_ex_to: str # 患者数延数_期間至(在宅) + ge_stay_avg: str # 平均在院日数(一般) + mt_stay_avg: str # 平均在院日数(療養) + mc_stay_avg: str # 平均在院日数(療養(医療)) + ca_stay_avg: str # 平均在院日数(療養(介護)) + pys_stay_avg: str # 平均在院日数(精神) + tub_stay_avg: str # 平均在院日数(結核) + inf_stay_avg: str # 平均在院日数(感染症) + stay_avg_sum: str # 平均在院日数(全体) + stay_avg_from: str # 平均在院日数_期間自 + stay_avg_to: str # 平均在院日数_期間至 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.adddel_div = record[5].strip() + self.maint_date = record[6].strip() + self.trn_date = record[7].strip() + self.info_date = record[8].strip() + self.home_page = record[9].strip() + self.hppre_flg = record[10].strip() + self.expre_flg = record[11].strip() + self.trial_flg = record[12].strip() + self.trial_cont_count = record[13].strip() + self.trial_whet_from = record[14].strip() + self.trial_whet_to = record[15].strip() + self.equipment_flg = record[16].strip() + self.cos_disease_flg = record[17].strip() + self.cos_surgery = record[18].strip() + self.specialclinic_flg = record[19].strip() + self.establishment_flg = record[20].strip() + self.critical_flg = record[21].strip() + self.cop_system = record[22].strip() + self.sys_exists_flg = record[23].strip() + self.sys_inspection = record[24].strip() + self.sys_prescription = record[25].strip() + self.sys_reserv = record[26].strip() + self.icduse_flg = record[27].strip() + self.echart_flg = record[28].strip() + self.fulltime_flg = record[29].strip() + self.fulltime_count = record[30].strip() + self.ge_patient_avg = record[31].strip() + self.mt_patient_avg = record[32].strip() + self.mc_patient_avg = record[33].strip() + self.ca_patient_avg = record[34].strip() + self.pys_patient_avg = record[35].strip() + self.tub_patient_avg = record[36].strip() + self.inf_patient_avg = record[37].strip() + self.patient_avg_sum = record[38].strip() + self.patient_avg_from = record[39].strip() + self.patient_avg_to = record[40].strip() + self.cl_patient_avg = record[41].strip() + self.cl_patient_avg_from = record[42].strip() + self.cl_patient_avg_to = record[43].strip() + self.hm_patient_avg = record[44].strip() + self.hm_patient_avg_from = record[45].strip() + self.hm_patient_avg_to = record[46].strip() + self.ge_patient_ex = record[47].strip() + self.mt_patient_ex = record[48].strip() + self.mc_patient_ex = record[49].strip() + self.ca_patient_ex = record[50].strip() + self.pys_patient_ex = record[51].strip() + self.tub_patient_ex = record[52].strip() + self.inf_patient_ex = record[53].strip() + self.patient_ex_sum = record[54].strip() + self.patient_ex_from = record[55].strip() + self.patient_ex_to = record[56].strip() + self.cl_patient_ex = record[57].strip() + self.cl_patient_ex_from = record[58].strip() + self.cl_patient_ex_to = record[59].strip() + self.hm_patient_ex = record[60].strip() + self.hm_patient_ex_from = record[61].strip() + self.hm_patient_ex_to = record[62].strip() + self.ge_stay_avg = record[63].strip() + self.mt_stay_avg = record[64].strip() + self.mc_stay_avg = record[65].strip() + self.ca_stay_avg = record[66].strip() + self.pys_stay_avg = record[67].strip() + self.tub_stay_avg = record[68].strip() + self.inf_stay_avg = record[69].strip() + self.stay_avg_sum = record[70].strip() + self.stay_avg_from = record[71].strip() + self.stay_avg_to = record[72].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py new file mode 100644 index 00000000..979e40a9 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py @@ -0,0 +1,34 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedDisTreat(UltmarcTable): + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + treatment_code: str # 疾患治療コード + pre_num: str # 前年比 + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4] + self.treatment_code = record[5].strip() + self.adddel_div = record[6] + self.pre_num = record[9] + + # Update判断フラグ。数値が空の場合は更新しない。 + self.is_pre_num_not_empty = True + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.pre_num = self.pre_num if len(self.pre_num) > 0 else None + self.is_pre_num_not_empty = self.pre_num is not None + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py new file mode 100644 index 00000000..c0d90d24 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py @@ -0,0 +1,34 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedEqupment(UltmarcTable): + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + equipment_code: str # 施設設備コード + bed_num: str # 病床数 + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4] + self.equipment_code = record[5].strip() + self.adddel_div = record[6] + self.bed_num = record[9] + + # Update判断フラグ。数値が空の場合は更新しない。 + self.is_bed_num_not_empty = True + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.bed_num = self.bed_num if len(self.bed_num) > 0 else None + self.is_bed_num_not_empty = self.bed_num is not None + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py new file mode 100644 index 00000000..4320bab2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py @@ -0,0 +1,25 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedSojournOpe(UltmarcTable): + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + cos_surgery_code: str # 短期滞在手術コード + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.cos_surgery_code = record[5].strip() + self.adddel_div = record[6].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py new file mode 100644 index 00000000..c26fc8e0 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py @@ -0,0 +1,29 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedSpOutpat(UltmarcTable): + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + specialclinic_name: str # 専門外来名 + sort_key: str # ソートキー + sectsub_cd: str # 分類補助コード + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.specialclinic_name = record[5].strip() + self.adddel_div = record[6].strip() + self.sort_key = record[9].strip() + self.sectsub_cd = record[10].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py new file mode 100644 index 00000000..ee950adb --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComRegnCriticPass(UltmarcTable): + """レイアウト区分026: COM_地域クリティカルパス""" + maint_flag: str # 修正区分 + regn_co_critic_pass_cd: str # 地域クリティカルパスコード + disease_name_kanji: str # 疾患名(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.regn_co_critic_pass_cd = record[1] + self.disease_name_kanji = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py new file mode 100644 index 00000000..f1e13bb2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComRehabili(UltmarcTable): + """レイアウト区分027: COM_疾患別リハビリテーション科""" + maint_flag: str # 修正区分 + rehabili_cd: str # 疾患別リハビリコード + rehabili_name: str # リハビリテーション名称(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.rehabili_cd = record[1] + self.rehabili_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py new file mode 100644 index 00000000..b1b33e66 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py @@ -0,0 +1,30 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSndMedSphe(UltmarcTable): + """レイアウト区分123: COM_医療圏二次医療圏""" + prefc_cd: str # 県コード + med_sphe_cd: str # 医療圏コード + thrd_cd: str # 3次コード + snd_med_sphe_name: str # 2次医療圏名 + requd_bed_or_equip_target: str # 基準病床数 or 整備目標数 + exist_bed_num: str # 既存病床数(病床数) + exist_bed_num_regist_ymd: str # 既存病床数(年月日) + plsmns_bed_num: str # 過不足病床数 + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.prefc_cd = record[1] + self.med_sphe_cd = record[2] + self.maintflag = record[3] + self.snd_med_sphe_name = record[6] + self.thrd_cd = record[7] + self.requd_bed_or_equip_target = record[8].strip() + self.exist_bed_num = record[9].strip() + self.exist_bed_num_regist_ymd = record[10] + self.plsmns_bed_num = record[11] + + # decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.requd_bed_or_equip_target = self.requd_bed_or_equip_target if len(self.requd_bed_or_equip_target) > 0 else None + self.exist_bed_num = self.exist_bed_num if len(self.exist_bed_num) > 0 else None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py new file mode 100644 index 00000000..556bef5b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSosiety(UltmarcTable): + """レイアウト区分009: COM_学会""" + sosiety_cd: str # 学会コード + sosiety_name: str # 学会名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.sosiety_cd = record[1] + self.maint_flag = record[2] + self.sosiety_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py new file mode 100644 index 00000000..d26fe53e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py @@ -0,0 +1,42 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSpField(UltmarcTable): + """レイアウト区分511: COM_専門分野""" + dcf_pcf_dr_cd: str # DCFPCF医師コード + dcf_dr_id: str # レコードID + dcf_dr_code: str # 個人コード + dcf_dr_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + specialist_cd: str # 専門医コード + specialist_maint_div: str # 予備/専門医メンテ区分 + specialist_flg: str # 専門医フラグ + specialist_publsh_ymd: str # 専門医掲載年月日 + ackn_med_flg: str # 認定医フラグ + ackn_med_publsh_ymd: str # 認定医掲載年月日 + guide_med_flg: str # 指導医フラグ + guide_med_publsh_ymd: str # 指導医掲載年月日 + +# メンテナンス年月日 と 予備/転送年月日 は未使用 + + def __init__(self, record: list[str]): + super().__init__(record) + + self.dcf_dr_id = record[1].strip() + self.dcf_dr_code = record[2].strip() + self.dcf_dr_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.specialist_cd = record[5].strip() + self.specialist_maint_div = record[6].strip() + + self.specialist_flg = record[9].strip() + self.specialist_publsh_ymd = record[10].strip() + + self.ackn_med_flg = record[11].strip() + self.ackn_med_publsh_ymd = record[12].strip() + + self.guide_med_flg = record[13].strip() + self.guide_med_publsh_ymd = record[14].strip() + + # DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備)) + self.dcf_pcf_dr_cd = ''.join([self.dcf_dr_id, self.dcf_dr_code, self.dcf_dr_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py new file mode 100644 index 00000000..f79acceb --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSpecialistLicense(UltmarcTable): + """レイアウト区分010: COM_専門医資格""" + specialist_cd: str # 専門医コード + specialist_license_name: str # 専門医資格名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.specialist_cd = record[1] + self.maint_flag = record[2] + self.specialist_license_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py new file mode 100644 index 00000000..600e1632 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py @@ -0,0 +1,16 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComThrdMed(UltmarcTable): + """レイアウト区分122: COM_医療圏3次マスタ""" + pref_code: str # 都道府県コード + thrd_cd: str # 3次コード + thrd_med_sphe_name: str # 3次医療圏名称 + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.pref_code = record[1] + self.thrd_cd = record[2] + self.maintflag = record[3] + self.thrd_med_sphe_name = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py new file mode 100644 index 00000000..0bc0612d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py @@ -0,0 +1,18 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComTrtCourse(UltmarcTable): + """レイアウト区分001: COM_診療科目""" + trt_course_cd: str # 診療科目コード + trt_course_name_kana: str # 診療科目名カナ + trt_course_name_abb: str # 診療科目名略称 + trt_course_name: str # 診療科目名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.trt_course_cd = record[1] + self.maint_flag = record[2] + self.trt_course_name_abb = record[5] + self.trt_course_name = record[6] + self.trt_course_name_kana = record[7] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py new file mode 100644 index 00000000..ae8e48ce --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class MstPrefc(UltmarcTable): + """レイアウト区分006: 都道府県マスタ""" + prefc_cd: str # 都道府県コード + prefc_name: str # 都道府県名称 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.prefc_name = record[5] + self.prefc_cd = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py new file mode 100644 index 00000000..ebbbc39d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py @@ -0,0 +1,9 @@ +class UltmarcTable: + """アルトマーク関連テーブルの抽象クラス""" + record: list + + def __init__(self, record: list): + self.record = record + + def to_sql_parameter(self): + return vars(self) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py new file mode 100644 index 00000000..ecd1f111 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -0,0 +1,174 @@ + +from src.db.database import Database +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_mapper import \ + ComAlmaMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_wrkplace_mapper import \ + ComDrWrkplaceMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_forfront_med_equip_mapper import \ + ComForfrontMedEquipMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hamtec_mapper import \ + ComHamtecMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_mapper import \ + ComInstMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper import \ + ComNurseAssrtMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_pharm_mapper import \ + ComPharmMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sp_field_mapper import \ + ComSpFieldMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_policy_med_mapper import \ + ComPolicyMedMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_rehabili_mapper import \ + ComRehabiliMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_regn_critic_pass_mapper import \ + ComRegnCriticPassMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_func_valuation_mapper import \ + ComMedFuncValuationMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \ + ComDrMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \ + ComDrSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_base_mapper import \ + ComPrefcMedBaseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_equpment_mapper import \ + ComPrefcMedEqupmentMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_dis_treat_mapper import \ + ComPrefcMedDisTreatMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sojourn_ope_mapper import \ + ComPrefcMedSojournOpeMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sp_outpat_mapper import \ + ComPrefcMedSpOutpatMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_att_mapper import \ + ComInstAttMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \ + ComCopHpMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_trt_course_mapper import \ + ComTrtCourseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hp_assrt_mapper import \ + ComHpAssrtMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_depart_disc_mapper import \ + ComAlmaDepartDiscMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper import \ + ComMedPrefcMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper import \ + ComThrdMedMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper import \ + ComSndMedSpheMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mapper import \ + ComMedAreaCityMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_post_mapper import \ + ComPostMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_manage_mapper import \ + ComManageMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import \ + MstPrefcMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper import \ + ComBlngSecMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper import \ + ComSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialist_license_mapper import \ + ComSpecialistLicenseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_div_mapper import \ + ComInstDivMapper + +# テーブルとのマッピング +COM_TABLE_LIST = { + # レコードID固定 + # COM_医師学会 + "521": ComDrSosietyMapper, + # COM_施設属性 + "111": ComInstAttMapper, + # COM_臨床研修病院 + "112": ComCopHpMapper, + # COM_医師 + "501": ComDrMapper, + # COM_施設 + "101": ComInstMapper, + # COM_薬局 + "102": ComPharmMapper, + # COM_医師勤務先 + "502": ComDrWrkplaceMapper, + # COM_専門分野 + "511": ComSpFieldMapper, + # COM_都道府県医療機能情報(基本) + "132": ComPrefcMedBaseMapper, + # COM_都道府県医療機能情報(施設設備) + "133": ComPrefcMedEqupmentMapper, + # COM_都道府県医療機能情報(疾患治療) + "134": ComPrefcMedDisTreatMapper, + # COM_都道府県医療機能情報(短期滞在手術) + "135": ComPrefcMedSojournOpeMapper, + # COM_都道府県医療機能情報(専門外来) + "136": ComPrefcMedSpOutpatMapper, + # COM_診療科目 + "001": ComTrtCourseMapper, + # COM_病院種別 + "002": ComHpAssrtMapper, + # COM_出身校学部識別 + "003": ComAlmaDepartDiscMapper, + # COM_出身校 + "004": ComAlmaMapper, + # COM_役職 + "005": ComPostMapper, + # 都道府県マスタ + "006": MstPrefcMapper, + # COM_経営体 + "007": ComManageMapper, + # COM_所属部科 + "008": ComBlngSecMapper, + # COM_学会 + "009": ComSosietyMapper, + # COM_専門医資格 + "010": ComSpecialistLicenseMapper, + # COM_施設区分 + "011": ComInstDivMapper, + # COM_高度先進医療 + "021": ComHamtecMapper, + # COM_先端医療機器 + "022": ComForfrontMedEquipMapper, + # COM_看護種別 + "023": ComNurseAssrtMapper, + # COM_医療機能評価 + "024": ComMedFuncValuationMapper, + # COM_地域クリティカルパス + "026": ComRegnCriticPassMapper, + # COM_疾患別リハビリテーション科 + "027": ComRehabiliMapper, + # COM_政策医療 + "028": ComPolicyMedMapper, + # COM_医療圏都道府県 + "121": ComMedPrefcMapper, + # COM_医療圏3次マスタ + "122": ComThrdMedMapper, + # COM_二次医療圏 + "123": ComSndMedSpheMapper, + # COM_医療圏都道府県市町村対照表 + "124": ComMedAreaCityMapper +} + + +class UltmarcTableMapperFactory: + + def create(self, layout_class: str, records: list[str], db: Database) -> UltmarcTableMapper: + """レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する + + Args: + layout_class (str): レイアウト区分 + records (list[str]): アルトマークデータの1行 + db (Database): データベース操作クラス + + 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) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py new file mode 100644 index 00000000..b693bd07 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -0,0 +1,163 @@ +# from src.batch.vjsk.vjsk_recv_file_manager import VjskDatFile +import os + +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('V実消化データ取込(DB登録)') +mapper = VjskReceiveFileMapper() + + +class VjskDataLoadManager: + """ + V実消化データ取込機能クラス + """ + + def __init__(self): + pass + + def _import_to_db(src_file_name: str, condkey: str): + """ + 概要 + 指定されたtsvファイル src_file_name を策席スキーマに登録する + 引数 + src_file_name: ローカルストレージにある取込対象tsvファイルパス + condkey: 受領データの種類を一意に示す値(VjskReceiveFileMapperクラスで管理されているCONDKEY値) + """ + logger.debug(f"_import_to_db start (src_file_name : {src_file_name}, condkey : {condkey})") + + db = Database.get_instance() + data_name = mapper.get_data_name(condkey) + table_name_org = mapper.get_org_table(condkey) + table_name_src = mapper.get_src_table(condkey) + upsert_sql = mapper.get_upsert_sql(condkey) + + try: + # データベース接続 + db.connect() + db.to_jst() + db.execute("SET SESSION sql_mode = 'TRADITIONAL';") + + # orgをtruncate + db.execute(f"TRUNCATE TABLE {table_name_org};") + + # orgにload ※warningが発生すれば異常終了させる + sql = f"""\ + LOAD DATA LOCAL INFILE :src_file_name + INTO TABLE {table_name_org} + FIELDS TERMINATED BY '\\t' + ENCLOSED BY '\"' + IGNORE 1 LINES; + """ + db.begin() + result = db.execute(sql, {"src_file_name": src_file_name}) + logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') + db.commit() + + # org→srcにinsert select + db.begin() + logger.debug(upsert_sql) + db.execute(upsert_sql) + # MEMO: insert+selectの結果件数は、LOAD結果と必ず等しいので、executeの結果件数はログ出力しない + # MEMO: insert+select 実質10件なのに、result.rowcountは20件になってしまう ※sqlalchemyの仕様 + # MEMO: https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount + logger.info(f'{table_name_org}を{table_name_src}にUPSERT') + + # データベースコミット + db.commit() + + except Exception as e: + db.rollback() + raise BatchOperationException(e) + + finally: + # データベース切断 + db.disconnect() + + logger.debug("_import_to_db done") + return + + def _get_tsv_last_row_tab_count(src_file_name: str) -> int: + """ + 概要 + 指定されたtsvファイル src_file_name の末尾行に含まれるタブ文字数を取得する + 引数 + src_file_name: ローカルストレージにある取込対象tsvファイルパス + """ + # memo: tsvファイルが数百MBに及ぶことを想定して、末尾から1行分を参照する + # memo: 前提1 行区切りは LF('\n') + # memo: 前提2 正常時のファイル終端にある文字は、末尾行の LF('\n') + # memo: 前提3 ファイルエンコードはBOM付UTF-8(先頭3byteが b'\xEF' + b'\xBB' + b'\xBF' ) + buf_count = 0 + + # ファイルサイズ取得 + file_size = os.path.getsize(src_file_name) + + # ファイルサイズが0byteなら処理終了 + if file_size == 0: + return buf_count + + # バイナリモードでファイルオープン + with open(src_file_name, 'rb') as file: + # ファイルポインタを末尾に移動 + file.seek(0, os.SEEK_END) + + # ファイルポインタが先頭+1になるまで逆方向にシークする + while file.tell() > 1: + # 2byte戻って + file.seek(-2, os.SEEK_CUR) + # 1byte読む(同時に+1シークする) + char = file.read(1) + # 行区切りを検出したらループ終了 + # memo: UTF-8 バイトシーケンスとして、b'\n' が全角文字の一部にはならない + if char == b'\n': + break + # ファイル先頭のBOM3byte目の BF を検出したらループ終了 + # memo: UTF-8 バイトシーケンスとして、b'\xbf' が全角文字の一部の可能性がある(例:全角片仮名の「タ」) + # memo: charに代入したときのfile.read(1)によって、ファイルポインタは2→3になっている前提のロジック + if char == b'\xbf' and file.tell() == 3: + break + last_line = file.readline().decode('utf-8-sig').rstrip('\n') + buf_count = last_line.count('\t') + + return buf_count + + @classmethod + def load(self, target: dict): + """ + 概要 + 取込対象受領ファイル target をデータベースに登録する + 引数 + target: { + condkey: 受領データの種類を一意に示す値(VjskReceiveFileMapperクラスで管理されているCONDKEY値) + src_file_path: ローカルストレージにある取込対象tsvファイルパス + } + """ + logger.debug(f'load start target:{target}') + + # S3からローカルストレージにdownloadした登録対象のtsvファイルパスを取得 + local_file_name = target["src_file_path"] + + # tsvファイル末尾行のTABの数が総定数と一致しない場合は例外をスロー + # memo: + # 対向元システムで生成されるファイルは稀に途中欠落が発生することがある。 + # これを、ファイルMySQL8.0のLOADステートメントで発生するWARNING/ERRORでは検知不可能なので、 + # LOADステートメント実行前に、物理的に途中欠落があるかを検知してエラーとすることが目的。 + tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) + expect_tabs = mapper.get_file_column_separators(target["condkey"]) + if tsv_tabs != expect_tabs: + msg = [ + "受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした", + f"local_file_name: {local_file_name}", + f"末尾行のtab数: {tsv_tabs}", + f"tab想定数: {expect_tabs}" + ] + raise BatchOperationException(' '.join(msg)) + + # データベース登録 + self._import_to_db(local_file_name, target["condkey"]) + + logger.debug('load done') + return diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py new file mode 100644 index 00000000..694f93ac --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -0,0 +1,258 @@ +from src.aws.s3 import ConfigBucket, VjskReceiveBucket +from src.batch.common.batch_context import BatchContext +from src.batch.common.calendar_file import CalendarFile +from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('V実消化データ取込') +batch_context = BatchContext.get_instance() +vjsk_recv_bucket = VjskReceiveBucket() +vjsk_mapper = VjskReceiveFileMapper() + + +def exec(): + """V実消化データ取込処理""" + logger.debug('exec start') + + # 非営業日なら何もせず終了 + if batch_context.is_not_business_day: + logger.debug('非営業日なので処理をスキップ') + return + + # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる + logger.debug('卸在庫データ取込対象日であるかを判定') + batch_context.is_vjsk_stock_import_day = _determine_today_is_stockslipdata_target() + logger.debug(f'判定結果 : {batch_context.is_vjsk_stock_import_day}') + if batch_context.is_vjsk_stock_import_day: + logger.info('卸在庫データ取込対象日です') + + # V実消化データファイル受領チェック + logger.debug('V実消化データファイル受領チェック:開始') + received_s3_files = [] + try: + # S3バケットにある受領済のV実消化データファイルの存在チェックをする + received_s3_files = _check_received_files() + + except BatchOperationException as e: + logger.debug('受領したV実消化データファイルに未受領もものがあります') + raise e + logger.debug('V実消化データファイル受領チェック:終了') + + # データベース取込 + logger.debug('V実消化データ取込:開始') + try: + # S3バケットにある受領済のV実消化データファイルをデータベースに登録する + _import_file_to_db(received_s3_files) + except Exception as e: + logger.debug(f'データベース登録失敗 {e}') + raise e + + # V実消化データ受領ファイルバックアップ退避 + logger.debug('V実消化データ受領ファイルバックアップ退避:開始') + try: + # 取込が完了したS3バケットにある受領ファイルをバックアップ用S3バケットに移動する + vjsk_recv_bucket.backup_dat_file(received_s3_files, batch_context.syor_date) + + except BatchOperationException as e: + logger.debug('V実消化データ受領ファイルのバックアップ退避が失敗しました') + raise e + logger.debug('V実消化データ受領ファイルバックアップ退避:終了') + + logger.debug('exec done') + + +def _check_if_file_exists(src_list: list, condkey: str) -> bool: + logger.debug(f"_check_if_file_exists start (src_list : {src_list} , condkey : {condkey})") + # ファイル接頭辞と拡張子が一致するかで判定する + ret = False + pref = vjsk_mapper.get_file_prefix(condkey) + suff = vjsk_mapper.get_file_suffix(condkey) + + for idx, elem in enumerate(src_list): + buf = elem.get("filename") + filename = buf[buf.rfind("/") + 1:] + if filename.startswith(pref) and filename.endswith(suff): + ret = True + break + + logger.debug(f"_check_if_file_exists done (return : {ret})") + return ret + + +def _check_received_files() -> list: + """V実消化連携データファイル受領確認処理""" + logger.debug('_check_received_files start') + + # S3バケット「実消化&アルトマーク V実消化データ受領バケット」にある受領ファイル一覧を取得 + received_s3_files = vjsk_recv_bucket.get_s3_file_list() + logger.debug(f'ファイル一覧{received_s3_files}') + + # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) + if batch_context.is_vjsk_stock_import_day: + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_STOCK_SLIP_DATA): + raise BatchOperationException(f'卸在庫データファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 卸販売データ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_SLIP_DATA): + raise BatchOperationException(f'卸販売データファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 卸組織変換マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_ORG_CNV_MST): + raise BatchOperationException(f'卸組織変換マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 施設統合マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_VOP_HCO_MERGE): + raise BatchOperationException(f'施設統合マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 卸マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_WHS_MST): + raise BatchOperationException(f'卸マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 卸ホールディングスマスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_HLD_MST): + raise BatchOperationException(f'卸ホールディングスマスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 施設マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_FCL_MST): + raise BatchOperationException(f'施設マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 メーカー卸組織展開表 + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_MKR_ORG_HORIZON): + raise BatchOperationException(f'メーカー卸組織展開表ファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 取引区分マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_TRAN_KBN_MST): + raise BatchOperationException(f'取引区分マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 製品マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_PHM_PRD_MST): + raise BatchOperationException(f'製品マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 製品価格マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_PHM_PRICE_MST): + raise BatchOperationException(f'製品価格マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 卸得意先情報マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST): + raise BatchOperationException(f'卸得意先情報マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 MDBコード変換マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): + raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 生物由来データ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_BIO_SLIP_DATA): + raise BatchOperationException(f'生物由来データファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 製造ロット番号マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_LOT_NUM_MST): + raise BatchOperationException(f'製造ロット番号マスタファイルがありません ファイル一覧:{received_s3_files}') + + # 想定外ファイルの受領確認 (想定ファイル数、卸在庫データ取込対象日の場合は15、そうでない場合は14) + naturally_count = 15 if batch_context.is_vjsk_stock_import_day else 14 + if len(received_s3_files) > naturally_count: + raise BatchOperationException(f'想定数を超える受領ファイルがあります ファイル一覧:{received_s3_files}') + + logger.debug('_check_received_files done') + + return received_s3_files + + +def _import_file_to_db(received_s3_files: list): + """V実消化連携データ取込処理""" + logger.debug('_import_file_to_db start') + + # S3バケット「実消化&アルトマーク V実消化データ受領バケット」の受領ファイルをローカルストレージにdownloadして辞書化する + target_dict = {} + for s3_file_path in received_s3_files: + file_name = s3_file_path.get('filename') + + # S3バケットにある受領ファイルをローカルストレージにdownloadする + logger.debug(f"download s3 file start : {file_name}") + local_file_path = vjsk_recv_bucket.download_data_file(file_name) + logger.debug(f"download s3 file done : {file_name}") + + # ローカルストレージにdownloadした受領ファイル(tar.gz)を解凍する + unzip_file_path = vjsk_recv_bucket.unzip_data_file(local_file_path) + logger.debug(f"unzip done : {unzip_file_path}") + + # データファイル名に該当する辞書アクセス用のキーを取得する + key = vjsk_mapper.get_condkey_by_s3_file_path(file_name) + + # 想定されたデータファイルであれば辞書登録する + if key is not None: + # ※受領ファイル(tar.gz)の書庫構成はtsvファイルが1つだけの前提 + target_dict[key] = {"condkey": key, "src_file_path": unzip_file_path[0]} + logger.debug(f'取込対象データファイル辞書{target_dict}') + + # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) + if batch_context.is_vjsk_stock_import_day: + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) + + # DB登録 卸販売データ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) + + # DB登録 卸組織変換マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) + + # DB登録 施設統合マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) + + # DB登録 卸マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) + + # DB登録 卸ホールディングスマスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) + + # DB登録 施設マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) + + # DB登録 メーカー卸組織展開表 + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) + + # DB登録 取引区分マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) + + # DB登録 製品マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) + + # DB登録 製品価格マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) + + # DB登録 卸得意先情報マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) + + # DB登録 MDBコード変換マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) + + # DB登録 生物由来データ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) + + # DB登録 製造ロット番号マスタ + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) + + logger.debug('_import_file_to_db done') + + +def _determine_today_is_stockslipdata_target(): + """設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日付が該当していればTrueを返却する""" + logger.debug("_determine_today_is_stockslipdata_target start") + try: + # 処理日付を取得する + today = batch_context.syor_date + + # S3バケット上の設定ファイル「V実消化卸在庫データ連携日ファイル」をローカルストレージにdownloadする + wholesaler_stock_list_file_path = ConfigBucket().download_wholesaler_stock_input_day_list() + + # 設定ファイル「V実消化卸在庫データ連携日ファイル」の定義内容を取得する + target_days = CalendarFile(wholesaler_stock_list_file_path) + + # 処理日付が、設定ファイル「V実消化卸在庫データ連携日ファイル」の定義に該当するかを判定する + ret = target_days.compare_date(today) + except Exception as e: + logger.error(f'{e}') + raise e + logger.debug("_determine_today_is_stockslipdata_target done") + return ret diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py new file mode 100644 index 00000000..5087eae9 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -0,0 +1,1576 @@ +import textwrap + + +class VjskReceiveFileMapper: + """ + V実消化データファイルI/Fマッピング定義クラス + """ + CONDKEY_SLIP_DATA = "SLIP_DATA" # 販売実績データ + CONDKEY_HLD_MST = "HLD_MST" # V卸ホールディングスマスタ + CONDKEY_WHS_MST = "WHS_MST" # V卸マスタ + CONDKEY_MKR_ORG_HORIZON = "MKR_ORG_HORIZON" # Vメーカー卸組織展開表 + CONDKEY_ORG_CNV_MST = "ORG_CNV_MST" # V卸組織変換マスタ + CONDKEY_TRAN_KBN_MST = "TRAN_KBN_MST" # V取引区分マスタ + CONDKEY_FCL_MST = "FCL_MST" # V施設マスタ + CONDKEY_PHM_PRD_MST = "PHM_PRD_MST" # V製品マスタ + CONDKEY_PHM_PRICE_MST = "PHM_PRICE_MST" # V製品価格マスタ + CONDKEY_VOP_HCO_MERGE = "VOP_HCO_MERGE" # V施設統合マスタ + CONDKEY_WHS_CUSTOMER_MST = "WHS_CUSTOMER_MST" # V卸得意先情報マスタ + CONDKEY_MDB_CONV_MST = "MDB_CONV_MST" # MDBコード変換表 + CONDKEY_STOCK_SLIP_DATA = "STOCK_SLIP_DATA" # 卸在庫データ + CONDKEY_BIO_SLIP_DATA = "BIO_SLIP_DATA" # 生物由来データ + CONDKEY_LOT_NUM_MST = "LOT_NUM_MST" # ロットマスタデータ + + _KEY_DATA_NAME = "data_name" + _KEY_FILE_PREFIX = "file_prefix" + _KEY_FILE_SUFFIX = "file_suffix" + _KEY_FILE_COLUMN_SEPARATORS = "file_column_separators" + _KEY_ORG_TABLE = "org_table" + _KEY_SRC_TABLE = "src_table" + _KEY_UPSERT_SQL = "upsert_sql" + _VJSK_INTERFACE_MAPPING = { + # 販売実績データ + CONDKEY_SLIP_DATA: { + _KEY_DATA_NAME: "販売実績データ", + _KEY_FILE_PREFIX: "slip_data_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "82", + _KEY_ORG_TABLE: "org05.sales", + _KEY_SRC_TABLE: "src05.sales", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.sales ( + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_whs_org_cd + ,rec_cust_cd + ,rec_comm_cd + ,rec_tran_kbn + ,rev_hsdnymd_wrk + ,rev_hsdnymd_srk + ,rec_urag_num + ,rec_qty + ,rec_nonyu_price + ,rec_nonyu_amt + ,rec_comm_name + ,rec_nonyu_fcl_name + ,free_item + ,rec_nonyu_fcl_addr + ,rec_nonyu_fcl_post + ,rec_nonyu_fcl_tel + ,rec_bef_hsdn_ymd + ,rec_bef_slip_num + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,hsdn_ymd + ,exec_dt + ,v_tran_cd + ,tran_kbn_name + ,whs_org_cd + ,v_whsorg_cd + ,whs_org_name + ,whs_org_kn + ,v_whs_cd + ,whs_name + ,nonyu_fcl_cd + ,v_inst_cd + ,v_inst_kn + ,v_inst_name + ,v_inst_addr + ,comm_cd + ,comm_name + ,nonyu_qty + ,nonyu_price + ,nonyu_amt + ,shikiri_price + ,shikiri_amt + ,nhi_price + ,nhi_amt + ,whspos_err_kbn + ,htdnymd_err_kbn + ,prd_exis_kbn + ,fcl_exis_kbn + ,bef_hsdn_ymd + ,bef_slip_num + ,slip_org_kbn + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,err_flg11 + ,err_flg12 + ,err_flg13 + ,err_flg14 + ,err_flg15 + ,err_flg16 + ,err_flg17 + ,err_flg18 + ,err_flg19 + ,err_flg20 + ,kjyo_ym + ,tksnbk_kbn + ,fcl_exec_kbn + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt + ) + SELECT + medaca_common.convert_empty_to_null(t.rec_data) + ,medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,medaca_common.convert_empty_to_null(t.rec_whs_org_cd) + ,medaca_common.convert_empty_to_null(t.rec_cust_cd) + ,medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,medaca_common.convert_empty_to_null(t.rec_tran_kbn) + ,medaca_common.convert_empty_to_null(t.rev_hsdnymd_wrk) + ,medaca_common.convert_empty_to_null(t.rev_hsdnymd_srk) + ,medaca_common.convert_empty_to_null(t.rec_urag_num) + ,medaca_common.convert_empty_to_null(t.rec_qty) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_price) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_amt) + ,medaca_common.convert_empty_to_null(t.rec_comm_name) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_name) + ,medaca_common.convert_empty_to_null(t.free_item) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_addr) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_post) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_tel) + ,medaca_common.convert_empty_to_null(t.rec_bef_hsdn_ymd) + ,medaca_common.convert_empty_to_null(t.rec_bef_slip_num) + ,medaca_common.convert_empty_to_null(t.rec_ymd) + ,medaca_common.convert_empty_to_null(t.sale_data_cat) + ,medaca_common.convert_empty_to_null(t.slip_file_name) + ,t.slip_mgt_num + ,t.row_num + ,medaca_common.convert_empty_to_null(t.hsdn_ymd) + ,medaca_common.convert_empty_to_null(t.exec_dt) + ,t.v_tran_cd + ,medaca_common.convert_empty_to_null(t.tran_kbn_name) + ,medaca_common.convert_empty_to_null(t.whs_org_cd) + ,t.v_whsorg_cd + ,medaca_common.convert_empty_to_null(t.whs_org_name) + ,medaca_common.convert_empty_to_null(t.whs_org_kn) + ,t.v_whs_cd + ,medaca_common.convert_empty_to_null(t.whs_name) + ,medaca_common.convert_empty_to_null(t.nonyu_fcl_cd) + ,medaca_common.convert_empty_to_null(t.v_inst_cd) + ,medaca_common.convert_empty_to_null(t.v_inst_kn) + ,medaca_common.convert_empty_to_null(t.v_inst_name) + ,medaca_common.convert_empty_to_null(t.v_inst_addr) + ,medaca_common.convert_empty_to_null(t.comm_cd) + ,medaca_common.convert_empty_to_null(t.comm_name) + ,t.nonyu_qty + ,t.nonyu_price + ,t.nonyu_amt + ,t.shikiri_price + ,t.shikiri_amt + ,t.nhi_price + ,t.nhi_amt + ,medaca_common.convert_empty_to_null(t.whspos_err_kbn) + ,medaca_common.convert_empty_to_null(t.htdnymd_err_kbn) + ,medaca_common.convert_empty_to_null(t.prd_exis_kbn) + ,medaca_common.convert_empty_to_null(t.fcl_exis_kbn) + ,medaca_common.convert_empty_to_null(t.bef_hsdn_ymd) + ,medaca_common.convert_empty_to_null(t.bef_slip_num) + ,t.slip_org_kbn + ,medaca_common.convert_empty_to_null(t.err_flg1) + ,medaca_common.convert_empty_to_null(t.err_flg2) + ,medaca_common.convert_empty_to_null(t.err_flg3) + ,medaca_common.convert_empty_to_null(t.err_flg4) + ,medaca_common.convert_empty_to_null(t.err_flg5) + ,medaca_common.convert_empty_to_null(t.err_flg6) + ,medaca_common.convert_empty_to_null(t.err_flg7) + ,medaca_common.convert_empty_to_null(t.err_flg8) + ,medaca_common.convert_empty_to_null(t.err_flg9) + ,medaca_common.convert_empty_to_null(t.err_flg10) + ,medaca_common.convert_empty_to_null(t.err_flg11) + ,medaca_common.convert_empty_to_null(t.err_flg12) + ,medaca_common.convert_empty_to_null(t.err_flg13) + ,medaca_common.convert_empty_to_null(t.err_flg14) + ,medaca_common.convert_empty_to_null(t.err_flg15) + ,medaca_common.convert_empty_to_null(t.err_flg16) + ,medaca_common.convert_empty_to_null(t.err_flg17) + ,medaca_common.convert_empty_to_null(t.err_flg18) + ,medaca_common.convert_empty_to_null(t.err_flg19) + ,medaca_common.convert_empty_to_null(t.err_flg20) + ,medaca_common.convert_empty_to_null(t.kjyo_ym) + ,medaca_common.convert_empty_to_null(t.tksnbk_kbn) + ,medaca_common.convert_empty_to_null(t.fcl_exec_kbn) + ,medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,medaca_common.convert_empty_to_null(t.ins_usr) + ,SYSDATE() + FROM org05.sales AS t + ON DUPLICATE KEY UPDATE + rec_data=medaca_common.convert_empty_to_null(t.rec_data) + ,rec_whs_cd=medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,rec_whs_sub_cd=medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,rec_whs_org_cd=medaca_common.convert_empty_to_null(t.rec_whs_org_cd) + ,rec_cust_cd=medaca_common.convert_empty_to_null(t.rec_cust_cd) + ,rec_comm_cd=medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,rec_tran_kbn=medaca_common.convert_empty_to_null(t.rec_tran_kbn) + ,rev_hsdnymd_wrk=medaca_common.convert_empty_to_null(t.rev_hsdnymd_wrk) + ,rev_hsdnymd_srk=medaca_common.convert_empty_to_null(t.rev_hsdnymd_srk) + ,rec_urag_num=medaca_common.convert_empty_to_null(t.rec_urag_num) + ,rec_qty=medaca_common.convert_empty_to_null(t.rec_qty) + ,rec_nonyu_price=medaca_common.convert_empty_to_null(t.rec_nonyu_price) + ,rec_nonyu_amt=medaca_common.convert_empty_to_null(t.rec_nonyu_amt) + ,rec_comm_name=medaca_common.convert_empty_to_null(t.rec_comm_name) + ,rec_nonyu_fcl_name=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_name) + ,free_item=medaca_common.convert_empty_to_null(t.free_item) + ,rec_nonyu_fcl_addr=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_addr) + ,rec_nonyu_fcl_post=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_post) + ,rec_nonyu_fcl_tel=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_tel) + ,rec_bef_hsdn_ymd=medaca_common.convert_empty_to_null(t.rec_bef_hsdn_ymd) + ,rec_bef_slip_num=medaca_common.convert_empty_to_null(t.rec_bef_slip_num) + ,rec_ymd=medaca_common.convert_empty_to_null(t.rec_ymd) + ,sale_data_cat=medaca_common.convert_empty_to_null(t.sale_data_cat) + ,slip_file_name=medaca_common.convert_empty_to_null(t.slip_file_name) + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,hsdn_ymd=medaca_common.convert_empty_to_null(t.hsdn_ymd) + ,exec_dt=medaca_common.convert_empty_to_null(t.exec_dt) + ,v_tran_cd=t.v_tran_cd + ,tran_kbn_name=medaca_common.convert_empty_to_null(t.tran_kbn_name) + ,whs_org_cd=medaca_common.convert_empty_to_null(t.whs_org_cd) + ,v_whsorg_cd=t.v_whsorg_cd + ,whs_org_name=medaca_common.convert_empty_to_null(t.whs_org_name) + ,whs_org_kn=medaca_common.convert_empty_to_null(t.whs_org_kn) + ,v_whs_cd=t.v_whs_cd + ,whs_name=medaca_common.convert_empty_to_null(t.whs_name) + ,nonyu_fcl_cd=medaca_common.convert_empty_to_null(t.nonyu_fcl_cd) + ,v_inst_cd=medaca_common.convert_empty_to_null(t.v_inst_cd) + ,v_inst_kn=medaca_common.convert_empty_to_null(t.v_inst_kn) + ,v_inst_name=medaca_common.convert_empty_to_null(t.v_inst_name) + ,v_inst_addr=medaca_common.convert_empty_to_null(t.v_inst_addr) + ,comm_cd=medaca_common.convert_empty_to_null(t.comm_cd) + ,comm_name=medaca_common.convert_empty_to_null(t.comm_name) + ,nonyu_qty=t.nonyu_qty + ,nonyu_price=t.nonyu_price + ,nonyu_amt=t.nonyu_amt + ,shikiri_price=t.shikiri_price + ,shikiri_amt=t.shikiri_amt + ,nhi_price=t.nhi_price + ,nhi_amt=t.nhi_amt + ,whspos_err_kbn=medaca_common.convert_empty_to_null(t.whspos_err_kbn) + ,htdnymd_err_kbn=medaca_common.convert_empty_to_null(t.htdnymd_err_kbn) + ,prd_exis_kbn=medaca_common.convert_empty_to_null(t.prd_exis_kbn) + ,fcl_exis_kbn=medaca_common.convert_empty_to_null(t.fcl_exis_kbn) + ,bef_hsdn_ymd=medaca_common.convert_empty_to_null(t.bef_hsdn_ymd) + ,bef_slip_num=medaca_common.convert_empty_to_null(t.bef_slip_num) + ,slip_org_kbn=t.slip_org_kbn + ,err_flg1=medaca_common.convert_empty_to_null(t.err_flg1) + ,err_flg2=medaca_common.convert_empty_to_null(t.err_flg2) + ,err_flg3=medaca_common.convert_empty_to_null(t.err_flg3) + ,err_flg4=medaca_common.convert_empty_to_null(t.err_flg4) + ,err_flg5=medaca_common.convert_empty_to_null(t.err_flg5) + ,err_flg6=medaca_common.convert_empty_to_null(t.err_flg6) + ,err_flg7=medaca_common.convert_empty_to_null(t.err_flg7) + ,err_flg8=medaca_common.convert_empty_to_null(t.err_flg8) + ,err_flg9=medaca_common.convert_empty_to_null(t.err_flg9) + ,err_flg10=medaca_common.convert_empty_to_null(t.err_flg10) + ,err_flg11=medaca_common.convert_empty_to_null(t.err_flg11) + ,err_flg12=medaca_common.convert_empty_to_null(t.err_flg12) + ,err_flg13=medaca_common.convert_empty_to_null(t.err_flg13) + ,err_flg14=medaca_common.convert_empty_to_null(t.err_flg14) + ,err_flg15=medaca_common.convert_empty_to_null(t.err_flg15) + ,err_flg16=medaca_common.convert_empty_to_null(t.err_flg16) + ,err_flg17=medaca_common.convert_empty_to_null(t.err_flg17) + ,err_flg18=medaca_common.convert_empty_to_null(t.err_flg18) + ,err_flg19=medaca_common.convert_empty_to_null(t.err_flg19) + ,err_flg20=medaca_common.convert_empty_to_null(t.err_flg20) + ,kjyo_ym=medaca_common.convert_empty_to_null(t.kjyo_ym) + ,tksnbk_kbn=medaca_common.convert_empty_to_null(t.tksnbk_kbn) + ,fcl_exec_kbn=medaca_common.convert_empty_to_null(t.fcl_exec_kbn) + ,rec_sts_kbn=medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,ins_dt=nullif(t.ins_dt, 0) + ,ins_usr=medaca_common.convert_empty_to_null(t.ins_usr) + ,dwh_upd_dT=SYSDATE() + ; + """) + }, + + # V卸ホールディングスマスタ + CONDKEY_HLD_MST: { + _KEY_DATA_NAME: "V卸ホールディングスマスタ", + _KEY_FILE_PREFIX: "hld_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "10", + _KEY_ORG_TABLE: "org05.hld_mst_v", + _KEY_SRC_TABLE: "src05.hld_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.hld_mst_v ( + v_hld_cd + ,sub_num + ,name + ,kn_name + ,abb_name + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.v_hld_cd + ,t.sub_num + ,t.name + ,medaca_common.convert_empty_to_null(t.kn_name) + ,medaca_common.convert_empty_to_null(t.abb_name) + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.hld_mst_v AS t + ON DUPLICATE KEY UPDATE + v_hld_cd=t.v_hld_cd + ,sub_num=t.sub_num + ,name=t.name + ,kn_name=medaca_common.convert_empty_to_null(t.kn_name) + ,abb_name=medaca_common.convert_empty_to_null(t.abb_name) + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V卸マスタ + CONDKEY_WHS_MST: { + _KEY_DATA_NAME: "V卸マスタ", + _KEY_FILE_PREFIX: "whs_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "15", + _KEY_ORG_TABLE: "org05.whs_mst_v", + _KEY_SRC_TABLE: "src05.whs_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whs_mst_v ( + v_whs_cd + ,sub_num + ,name + ,kn_name + ,abb_name + ,postal_cd + ,addr + ,kn_addr + ,tel_num + ,v_hld_cd + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.v_whs_cd + ,t.sub_num + ,t.name + ,medaca_common.convert_empty_to_null(t.kn_name) + ,medaca_common.convert_empty_to_null(t.abb_name) + ,medaca_common.convert_empty_to_null(t.postal_cd) + ,medaca_common.convert_empty_to_null(t.addr) + ,medaca_common.convert_empty_to_null(t.kn_addr) + ,medaca_common.convert_empty_to_null(t.tel_num) + ,t.v_hld_cd + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.whs_mst_v AS t + ON DUPLICATE KEY UPDATE + v_whs_cd=t.v_whs_cd + ,sub_num=t.sub_num + ,name=t.name + ,kn_name=medaca_common.convert_empty_to_null(t.kn_name) + ,abb_name=medaca_common.convert_empty_to_null(t.abb_name) + ,postal_cd=medaca_common.convert_empty_to_null(t.postal_cd) + ,addr=medaca_common.convert_empty_to_null(t.addr) + ,kn_addr=medaca_common.convert_empty_to_null(t.kn_addr) + ,tel_num=medaca_common.convert_empty_to_null(t.tel_num) + ,v_hld_cd=t.v_hld_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # Vメーカー卸組織展開表 + CONDKEY_MKR_ORG_HORIZON: { + _KEY_DATA_NAME: "Vメーカー卸組織展開表", + _KEY_FILE_PREFIX: "mkr_org_horizon_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "45", + _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", + _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.mkr_org_horizon_v ( + vid_kind_1 + ,v_cd_1 + ,name_1 + ,dsp_odr_1 + ,vid_kind_2 + ,v_cd_2 + ,name_2 + ,dsp_odr_2 + ,vid_kind_3 + ,v_cd_3 + ,name_3 + ,dsp_odr_3 + ,vid_kind_4 + ,v_cd_4 + ,name_4 + ,dsp_odr_4 + ,vid_kind_5 + ,v_cd_5 + ,name_5 + ,dsp_odr_5 + ,vid_kind_6 + ,v_cd_6 + ,name_6 + ,dsp_odr_6 + ,vid_kind_7 + ,v_cd_7 + ,name_7 + ,dsp_odr_7 + ,vid_kind_8 + ,v_cd_8 + ,name_8 + ,dsp_odr_8 + ,vid_kind_9 + ,v_cd_9 + ,name_9 + ,dsp_odr_9 + ,vid_kind_10 + ,v_cd_10 + ,name_10 + ,dsp_odr_10 + ,v_whs_cd + ,start_date + ,end_date + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.vid_kind_1 + ,t.v_cd_1 + ,medaca_common.convert_empty_to_null(t.name_1) + ,t.dsp_odr_1 + ,t.vid_kind_2 + ,t.v_cd_2 + ,medaca_common.convert_empty_to_null(t.name_2) + ,t.dsp_odr_2 + ,t.vid_kind_3 + ,t.v_cd_3 + ,medaca_common.convert_empty_to_null(t.name_3) + ,t.dsp_odr_3 + ,t.vid_kind_4 + ,t.v_cd_4 + ,medaca_common.convert_empty_to_null(t.name_4) + ,t.dsp_odr_4 + ,t.vid_kind_5 + ,t.v_cd_5 + ,medaca_common.convert_empty_to_null(t.name_5) + ,t.dsp_odr_5 + ,t.vid_kind_6 + ,t.v_cd_6 + ,medaca_common.convert_empty_to_null(t.name_6) + ,t.dsp_odr_6 + ,t.vid_kind_7 + ,t.v_cd_7 + ,medaca_common.convert_empty_to_null(t.name_7) + ,t.dsp_odr_7 + ,t.vid_kind_8 + ,t.v_cd_8 + ,medaca_common.convert_empty_to_null(t.name_8) + ,t.dsp_odr_8 + ,t.vid_kind_9 + ,t.v_cd_9 + ,medaca_common.convert_empty_to_null(t.name_9) + ,t.dsp_odr_9 + ,t.vid_kind_10 + ,t.v_cd_10 + ,medaca_common.convert_empty_to_null(t.name_10) + ,t.dsp_odr_10 + ,t.v_whs_cd + ,t.start_date + ,t.end_date + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.mkr_org_horizon_v AS t + ON DUPLICATE KEY UPDATE + vid_kind_1=t.vid_kind_1 + ,v_cd_1=t.v_cd_1 + ,name_1=medaca_common.convert_empty_to_null(t.name_1) + ,dsp_odr_1=t.dsp_odr_1 + ,vid_kind_2=t.vid_kind_2 + ,v_cd_2=t.v_cd_2 + ,name_2=medaca_common.convert_empty_to_null(t.name_2) + ,dsp_odr_2=t.dsp_odr_2 + ,vid_kind_3=t.vid_kind_3 + ,v_cd_3=t.v_cd_3 + ,name_3=medaca_common.convert_empty_to_null(t.name_3) + ,dsp_odr_3=t.dsp_odr_3 + ,vid_kind_4=t.vid_kind_4 + ,v_cd_4=t.v_cd_4 + ,name_4=medaca_common.convert_empty_to_null(t.name_4) + ,dsp_odr_4=t.dsp_odr_4 + ,vid_kind_5=t.vid_kind_5 + ,v_cd_5=t.v_cd_5 + ,name_5=medaca_common.convert_empty_to_null(t.name_5) + ,dsp_odr_5=t.dsp_odr_5 + ,vid_kind_6=t.vid_kind_6 + ,v_cd_6=t.v_cd_6 + ,name_6=medaca_common.convert_empty_to_null(t.name_6) + ,dsp_odr_6=t.dsp_odr_6 + ,vid_kind_7=t.vid_kind_7 + ,v_cd_7=t.v_cd_7 + ,name_7=medaca_common.convert_empty_to_null(t.name_7) + ,dsp_odr_7=t.dsp_odr_7 + ,vid_kind_8=t.vid_kind_8 + ,v_cd_8=t.v_cd_8 + ,name_8=medaca_common.convert_empty_to_null(t.name_8) + ,dsp_odr_8=t.dsp_odr_8 + ,vid_kind_9=t.vid_kind_9 + ,v_cd_9=t.v_cd_9 + ,name_9=medaca_common.convert_empty_to_null(t.name_9) + ,dsp_odr_9=t.dsp_odr_9 + ,vid_kind_10=t.vid_kind_10 + ,v_cd_10=t.v_cd_10 + ,name_10=medaca_common.convert_empty_to_null(t.name_10) + ,dsp_odr_10=t.dsp_odr_10 + ,v_whs_cd=t.v_whs_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V卸組織変換マスタ + CONDKEY_ORG_CNV_MST: { + _KEY_DATA_NAME: "V卸組織変換マスタ", + _KEY_FILE_PREFIX: "org_cnv_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "10", + _KEY_ORG_TABLE: "org05.org_cnv_mst_v", + _KEY_SRC_TABLE: "src05.org_cnv_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.org_cnv_mst_v ( + whs_cd + ,whs_sub_cd + ,org_cd + ,sub_num + ,v_org_cd + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + -- NULLに変換する対象のカラムはない + SELECT + t.whs_cd + ,t.whs_sub_cd + ,t.org_cd + ,t.sub_num + ,t.v_org_cd + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.org_cnv_mst_v AS t + ON DUPLICATE KEY UPDATE + whs_cd=t.whs_cd + ,whs_sub_cd=t.whs_sub_cd + ,org_cd=t.org_cd + ,sub_num=t.sub_num + ,v_org_cd=t.v_org_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V取引区分マスタ + CONDKEY_TRAN_KBN_MST: { + _KEY_DATA_NAME: "V取引区分マスタ", + _KEY_FILE_PREFIX: "tran_kbn_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "8", + _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", + _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.tran_kbn_mst_v ( + v_tran_cd + ,sub_num + ,name + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.v_tran_cd + ,t.sub_num + ,medaca_common.convert_empty_to_null(t.name) + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.tran_kbn_mst_v AS t + ON DUPLICATE KEY UPDATE + v_tran_cd=t.v_tran_cd + ,sub_num=t.sub_num + ,name=medaca_common.convert_empty_to_null(t.name) + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V施設マスタ + CONDKEY_FCL_MST: { + _KEY_DATA_NAME: "V施設マスタ", + _KEY_FILE_PREFIX: "fcl_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "23", + _KEY_ORG_TABLE: "org05.fcl_mst_v", + _KEY_SRC_TABLE: "src05.fcl_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.fcl_mst_v ( + v_inst_cd + ,sub_num + ,start_date + ,end_date + ,closed_dt + ,fcl_name + ,fcl_kn_name + ,fcl_abb_name + ,fcl_abb_kn_name + ,mkr_cd + ,jsk_proc_kbn + ,fmt_addr + ,fmt_kn_addr + ,postal_cd + ,prft_cd + ,prft_name + ,city_name + ,addr_line_1 + ,tel_num + ,admin_kbn + ,fcl_type + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.v_inst_cd + ,t.sub_num + ,t.start_date + ,t.end_date + ,medaca_common.convert_empty_to_null(t.closed_dt) + ,medaca_common.convert_empty_to_null(t.fcl_name) + ,medaca_common.convert_empty_to_null(t.fcl_kn_name) + ,medaca_common.convert_empty_to_null(t.fcl_abb_name) + ,medaca_common.convert_empty_to_null(t.fcl_abb_kn_name) + ,medaca_common.convert_empty_to_null(t.mkr_cd) + ,t.jsk_proc_kbn + ,medaca_common.convert_empty_to_null(t.fmt_addr) + ,medaca_common.convert_empty_to_null(t.fmt_kn_addr) + ,medaca_common.convert_empty_to_null(t.postal_cd) + ,medaca_common.convert_empty_to_null(t.prft_cd) + ,medaca_common.convert_empty_to_null(t.prft_name) + ,medaca_common.convert_empty_to_null(t.city_name) + ,medaca_common.convert_empty_to_null(t.addr_line_1) + ,medaca_common.convert_empty_to_null(t.tel_num) + ,medaca_common.convert_empty_to_null(t.admin_kbn) + ,medaca_common.convert_empty_to_null(t.fcl_type) + ,t.rec_sts_kbn + ,medaca_common.convert_empty_to_null(t.ins_dt) -- (留意)fcm_mst_vではvarchar型 + ,medaca_common.convert_empty_to_null(t.upd_dt) -- (留意)fcm_mst_vではvarchar型 + ,SYSDATE() + FROM org05.fcl_mst_v AS t + ON DUPLICATE KEY UPDATE + v_inst_cd=t.v_inst_cd + ,sub_num=t.sub_num + ,start_date=t.start_date + ,end_date=t.end_date + ,closed_dt=medaca_common.convert_empty_to_null(t.closed_dt) + ,fcl_name=medaca_common.convert_empty_to_null(t.fcl_name) + ,fcl_kn_name=medaca_common.convert_empty_to_null(t.fcl_kn_name) + ,fcl_abb_name=medaca_common.convert_empty_to_null(t.fcl_abb_name) + ,fcl_abb_kn_name=medaca_common.convert_empty_to_null(t.fcl_abb_kn_name) + ,mkr_cd=medaca_common.convert_empty_to_null(t.mkr_cd) + ,jsk_proc_kbn=t.jsk_proc_kbn + ,fmt_addr=medaca_common.convert_empty_to_null(t.fmt_addr) + ,fmt_kn_addr=medaca_common.convert_empty_to_null(t.fmt_kn_addr) + ,postal_cd=medaca_common.convert_empty_to_null(t.postal_cd) + ,prft_cd=medaca_common.convert_empty_to_null(t.prft_cd) + ,prft_name=medaca_common.convert_empty_to_null(t.prft_name) + ,city_name=medaca_common.convert_empty_to_null(t.city_name) + ,addr_line_1=medaca_common.convert_empty_to_null(t.addr_line_1) + ,tel_num=medaca_common.convert_empty_to_null(t.tel_num) + ,admin_kbn=medaca_common.convert_empty_to_null(t.admin_kbn) + ,fcl_type=medaca_common.convert_empty_to_null(t.fcl_type) + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=medaca_common.convert_empty_to_null(t.ins_dt) + ,upd_dt=medaca_common.convert_empty_to_null(t.upd_dt) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V製品マスタ + CONDKEY_PHM_PRD_MST: { + _KEY_DATA_NAME: "V製品マスタ", + _KEY_FILE_PREFIX: "phm_prd_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "27", + _KEY_ORG_TABLE: "org05.phm_prd_mst_v", + _KEY_SRC_TABLE: "src05.phm_prd_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.phm_prd_mst_v ( + prd_cd + ,sub_num + ,prd_name + ,prd_e_name + ,mkr_cd + ,mkr_inf_1 + ,mkr_inf_2 + ,phm_itm_cd + ,itm_name + ,itm_abb_name + ,form_cd + ,form_name + ,vol_cd + ,vol_name + ,cont_cd + ,cont_name + ,pkg_cd + ,pkg_name + ,cnv_num + ,jsk_start_dt + ,prd_sale_kbn + ,jsk_proc_kbn + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.prd_cd + ,t.sub_num + ,t.prd_name + ,medaca_common.convert_empty_to_null(t.prd_e_name) + ,medaca_common.convert_empty_to_null(t.mkr_cd) + ,medaca_common.convert_empty_to_null(t.mkr_inf_1) + ,medaca_common.convert_empty_to_null(t.mkr_inf_2) + ,medaca_common.convert_empty_to_null(t.phm_itm_cd) + ,medaca_common.convert_empty_to_null(t.itm_name) + ,medaca_common.convert_empty_to_null(t.itm_abb_name) + ,medaca_common.convert_empty_to_null(t.form_cd) + ,medaca_common.convert_empty_to_null(t.form_name) + ,medaca_common.convert_empty_to_null(t.vol_cd) + ,medaca_common.convert_empty_to_null(t.vol_name) + ,medaca_common.convert_empty_to_null(t.cont_cd) + ,medaca_common.convert_empty_to_null(t.cont_name) + ,medaca_common.convert_empty_to_null(t.pkg_cd) + ,medaca_common.convert_empty_to_null(t.pkg_name) + ,t.cnv_num + ,nullif(t.jsk_start_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,t.prd_sale_kbn + ,t.jsk_proc_kbn + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.phm_prd_mst_v AS t + ON DUPLICATE KEY UPDATE + prd_cd=t.prd_cd + ,sub_num=t.sub_num + ,prd_name=t.prd_name + ,prd_e_name=medaca_common.convert_empty_to_null(t.prd_e_name) + ,mkr_cd=medaca_common.convert_empty_to_null(t.mkr_cd) + ,mkr_inf_1=medaca_common.convert_empty_to_null(t.mkr_inf_1) + ,mkr_inf_2=medaca_common.convert_empty_to_null(t.mkr_inf_2) + ,phm_itm_cd=medaca_common.convert_empty_to_null(t.phm_itm_cd) + ,itm_name=medaca_common.convert_empty_to_null(t.itm_name) + ,itm_abb_name=medaca_common.convert_empty_to_null(t.itm_abb_name) + ,form_cd=medaca_common.convert_empty_to_null(t.form_cd) + ,form_name=medaca_common.convert_empty_to_null(t.form_name) + ,vol_cd=medaca_common.convert_empty_to_null(t.vol_cd) + ,vol_name=medaca_common.convert_empty_to_null(t.vol_name) + ,cont_cd=medaca_common.convert_empty_to_null(t.cont_cd) + ,cont_name=medaca_common.convert_empty_to_null(t.cont_name) + ,pkg_cd=medaca_common.convert_empty_to_null(t.pkg_cd) + ,pkg_name=medaca_common.convert_empty_to_null(t.pkg_name) + ,cnv_num=t.cnv_num + ,jsk_start_dt=nullif(t.jsk_start_dt, 0) + ,prd_sale_kbn=t.prd_sale_kbn + ,jsk_proc_kbn=t.jsk_proc_kbn + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V製品価格マスタ + CONDKEY_PHM_PRICE_MST: { + _KEY_DATA_NAME: "V製品価格マスタ", + _KEY_FILE_PREFIX: "phm_price_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "9", + _KEY_ORG_TABLE: "org05.phm_price_mst_v", + _KEY_SRC_TABLE: "src05.phm_price_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.phm_price_mst_v ( + phm_prd_cd + ,phm_price_kind + ,sub_num + ,price + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + -- NULLに変換する対象のカラムはない + t.phm_prd_cd + ,t.phm_price_kind + ,t.sub_num + ,t.price + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.phm_price_mst_v AS t + ON DUPLICATE KEY UPDATE + phm_prd_cd=t.phm_prd_cd + ,phm_price_kind=t.phm_price_kind + ,sub_num=t.sub_num + ,price=t.price + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V施設統合マスタ + CONDKEY_VOP_HCO_MERGE: { + _KEY_DATA_NAME: "V施設統合マスタ", + _KEY_FILE_PREFIX: "vop_hco_merge_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "3", + _KEY_ORG_TABLE: "org05.vop_hco_merge_v", + _KEY_SRC_TABLE: "src05.vop_hco_merge_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.vop_hco_merge_v ( + v_inst_cd + ,v_inst_cd_merg + ,apply_dt + ,merge_reason + ,dwh_upd_dt + ) + -- NULLに変換する対象のカラムはない + SELECT + t.v_inst_cd + ,t.v_inst_cd_merg + ,t.apply_dt + ,t.merge_reason + ,SYSDATE() + FROM org05.vop_hco_merge_v AS t + ON DUPLICATE KEY UPDATE + v_inst_cd=t.v_inst_cd + ,v_inst_cd_merg=t.v_inst_cd_merg + ,apply_dt=t.apply_dt + ,merge_reason=t.merge_reason + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # V卸得意先情報マスタ + CONDKEY_WHS_CUSTOMER_MST: { + _KEY_DATA_NAME: "V卸得意先情報マスタ", + _KEY_FILE_PREFIX: "whs_customer_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "16", + _KEY_ORG_TABLE: "org05.whs_customer_mst_v", + _KEY_SRC_TABLE: "src05.whs_customer_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whs_customer_mst_v ( + whs_cd + ,whs_sub_cd + ,customer_cd + ,sub_num + ,start_date + ,end_date + ,whs_org_cd + ,src_org_cd + ,name + ,kn_name + ,addr + ,kn_addr + ,postal_cd + ,tel_num + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + SELECT + t.whs_cd + ,t.whs_sub_cd + ,t.customer_cd + ,t.sub_num + ,t.start_date + ,t.end_date + ,medaca_common.convert_empty_to_null(t.whs_org_cd) + ,medaca_common.convert_empty_to_null(t.src_org_cd) + ,medaca_common.convert_empty_to_null(t.name) + ,medaca_common.convert_empty_to_null(t.kn_name) + ,medaca_common.convert_empty_to_null(t.addr) + ,medaca_common.convert_empty_to_null(t.kn_addr) + ,medaca_common.convert_empty_to_null(t.postal_cd) + ,medaca_common.convert_empty_to_null(t.tel_num) + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.whs_customer_mst_v AS t + ON DUPLICATE KEY UPDATE + whs_cd=t.whs_cd + ,whs_sub_cd=t.whs_sub_cd + ,customer_cd=t.customer_cd + ,sub_num=t.sub_num + ,start_date=t.start_date + ,end_date=t.end_date + ,whs_org_cd=medaca_common.convert_empty_to_null(t.whs_org_cd) + ,src_org_cd=medaca_common.convert_empty_to_null(t.src_org_cd) + ,name=medaca_common.convert_empty_to_null(t.name) + ,kn_name=medaca_common.convert_empty_to_null(t.kn_name) + ,addr=medaca_common.convert_empty_to_null(t.addr) + ,kn_addr=medaca_common.convert_empty_to_null(t.kn_addr) + ,postal_cd=medaca_common.convert_empty_to_null(t.postal_cd) + ,tel_num=medaca_common.convert_empty_to_null(t.tel_num) + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # MDBコード変換表 + CONDKEY_MDB_CONV_MST: { + _KEY_DATA_NAME: "MDBコード変換表", + _KEY_FILE_PREFIX: "mdb_conv_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "7", + _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", + _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.mdb_cnv_mst_v ( + hco_vid_v + ,sub_num + ,mdb_cd + ,reliability + ,start_date + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt + ) + -- NULLに変換する対象のカラムはない + SELECT + t.hco_vid_v + ,t.sub_num + ,t.mdb_cd + ,t.reliability + ,t.start_date + ,t.rec_sts_kbn + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,nullif(t.upd_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,SYSDATE() + FROM org05.mdb_cnv_mst_v AS t + ON DUPLICATE KEY UPDATE + hco_vid_v=t.hco_vid_v + ,sub_num=t.sub_num + ,mdb_cd=t.mdb_cd + ,reliability=t.reliability + ,start_date=t.start_date + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=nullif(t.ins_dt, 0) + ,upd_dt=nullif(t.upd_dt, 0) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # 卸在庫データ + CONDKEY_STOCK_SLIP_DATA: { + _KEY_DATA_NAME: "卸在庫データ", + _KEY_FILE_PREFIX: "stock_slip_data_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "28", + _KEY_ORG_TABLE: "org05.whole_stock", + _KEY_SRC_TABLE: "src05.whole_stock", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whole_stock ( + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_sto_place + ,rec_stock_ymd + ,rec_comm_cd + ,rec_qty + ,rec_stock_no_sign + ,rec_jan_cd + ,free_item + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,exec_dt + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt + ) + SELECT + medaca_common.convert_empty_to_null(t.rec_data) + ,medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,medaca_common.convert_empty_to_null(t.rec_sto_place) + ,medaca_common.convert_empty_to_null(t.rec_stock_ymd) + ,medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,medaca_common.convert_empty_to_null(t.rec_qty) + ,medaca_common.convert_empty_to_null(t.rec_stock_no_sign) + ,medaca_common.convert_empty_to_null(t.rec_jan_cd) + ,medaca_common.convert_empty_to_null(t.free_item) + ,medaca_common.convert_empty_to_null(t.rec_ymd) + ,medaca_common.convert_empty_to_null(t.sale_data_cat) + ,medaca_common.convert_empty_to_null(t.slip_file_name) + ,t.slip_mgt_num + ,t.row_num + ,medaca_common.convert_empty_to_null(t.exec_dt) + ,medaca_common.convert_empty_to_null(t.err_flg1) + ,medaca_common.convert_empty_to_null(t.err_flg2) + ,medaca_common.convert_empty_to_null(t.err_flg3) + ,medaca_common.convert_empty_to_null(t.err_flg4) + ,medaca_common.convert_empty_to_null(t.err_flg5) + ,medaca_common.convert_empty_to_null(t.err_flg6) + ,medaca_common.convert_empty_to_null(t.err_flg7) + ,medaca_common.convert_empty_to_null(t.err_flg8) + ,medaca_common.convert_empty_to_null(t.err_flg9) + ,medaca_common.convert_empty_to_null(t.err_flg10) + ,medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,medaca_common.convert_empty_to_null(t.ins_usr) + ,SYSDATE() + FROM org05.whole_stock AS t + ON DUPLICATE KEY UPDATE + rec_data=medaca_common.convert_empty_to_null(t.rec_data) + ,rec_whs_cd=medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,rec_whs_sub_cd=medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,rec_sto_place=medaca_common.convert_empty_to_null(t.rec_sto_place) + ,rec_stock_ymd=medaca_common.convert_empty_to_null(t.rec_stock_ymd) + ,rec_comm_cd=medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,rec_qty=medaca_common.convert_empty_to_null(t.rec_qty) + ,rec_stock_no_sign=medaca_common.convert_empty_to_null(t.rec_stock_no_sign) + ,rec_jan_cd=medaca_common.convert_empty_to_null(t.rec_jan_cd) + ,free_item=medaca_common.convert_empty_to_null(t.free_item) + ,rec_ymd=medaca_common.convert_empty_to_null(t.rec_ymd) + ,sale_data_cat=medaca_common.convert_empty_to_null(t.sale_data_cat) + ,slip_file_name=medaca_common.convert_empty_to_null(t.slip_file_name) + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,exec_dt=medaca_common.convert_empty_to_null(t.exec_dt) + ,err_flg1=medaca_common.convert_empty_to_null(t.err_flg1) + ,err_flg2=medaca_common.convert_empty_to_null(t.err_flg2) + ,err_flg3=medaca_common.convert_empty_to_null(t.err_flg3) + ,err_flg4=medaca_common.convert_empty_to_null(t.err_flg4) + ,err_flg5=medaca_common.convert_empty_to_null(t.err_flg5) + ,err_flg6=medaca_common.convert_empty_to_null(t.err_flg6) + ,err_flg7=medaca_common.convert_empty_to_null(t.err_flg7) + ,err_flg8=medaca_common.convert_empty_to_null(t.err_flg8) + ,err_flg9=medaca_common.convert_empty_to_null(t.err_flg9) + ,err_flg10=medaca_common.convert_empty_to_null(t.err_flg10) + ,rec_sts_kbn=medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,ins_dt=nullif(t.ins_dt, 0) + ,ins_usr=medaca_common.convert_empty_to_null(t.ins_usr) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # 生物由来データ + CONDKEY_BIO_SLIP_DATA: { + _KEY_DATA_NAME: "生物由来データ", + _KEY_FILE_PREFIX: "bio_slip_data_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "77", + _KEY_ORG_TABLE: "org05.bio_sales", + _KEY_SRC_TABLE: "src05.bio_sales", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.bio_sales ( + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_whs_org_cd + ,rec_cust_cd + ,rec_comm_cd + ,rec_tran_kbn + ,rev_hsdnymd_wrk + ,rev_hsdnymd_srk + ,rec_urag_num + ,rec_comm_name + ,rec_nonyu_fcl_name + ,rec_nonyu_fcl_addr + ,rec_lot_num1 + ,rec_qty1 + ,rec_lot_num2 + ,rec_qty2 + ,rec_lot_num3 + ,rec_qty3 + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,hsdn_ymd + ,exec_dt + ,v_tran_cd + ,tran_kbn_name + ,whs_org_cd + ,v_whsorg_cd + ,whs_org_name + ,whs_org_kn + ,v_whs_cd + ,whs_name + ,nonyu_fcl_cd + ,v_inst_cd + ,v_inst_name + ,v_inst_kn + ,v_inst_addr + ,comm_cd + ,product_name + ,htdnymd_err_kbn + ,prd_exis_kbn + ,fcl_exis_kbn + ,qty1 + ,qty2 + ,qty3 + ,slip_org_kbn + ,bef_slip_mgt_num + ,whs_rep_comm_name + ,whs_rep_nonyu_fcl_name + ,whs_rep_nonyu_fcl_addr + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,err_flg11 + ,err_flg12 + ,err_flg13 + ,err_flg14 + ,err_flg15 + ,err_flg16 + ,err_flg17 + ,err_flg18 + ,err_flg19 + ,err_flg20 + ,kjyo_ym + ,tksnbk_kbn + ,fcl_exec_kbn + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt + ) + SELECT + medaca_common.convert_empty_to_null(t.rec_data) + ,medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,medaca_common.convert_empty_to_null(t.rec_whs_org_cd) + ,medaca_common.convert_empty_to_null(t.rec_cust_cd) + ,medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,medaca_common.convert_empty_to_null(t.rec_tran_kbn) + ,medaca_common.convert_empty_to_null(t.rev_hsdnymd_wrk) + ,medaca_common.convert_empty_to_null(t.rev_hsdnymd_srk) + ,medaca_common.convert_empty_to_null(t.rec_urag_num) + ,medaca_common.convert_empty_to_null(t.rec_comm_name) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_name) + ,medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_addr) + ,medaca_common.convert_empty_to_null(t.rec_lot_num1) + ,medaca_common.convert_empty_to_null(t.rec_qty1) + ,medaca_common.convert_empty_to_null(t.rec_lot_num2) + ,medaca_common.convert_empty_to_null(t.rec_qty2) + ,medaca_common.convert_empty_to_null(t.rec_lot_num3) + ,medaca_common.convert_empty_to_null(t.rec_qty3) + ,medaca_common.convert_empty_to_null(t.rec_ymd) + ,medaca_common.convert_empty_to_null(t.sale_data_cat) + ,medaca_common.convert_empty_to_null(t.slip_file_name) + ,t.slip_mgt_num + ,t.row_num + ,medaca_common.convert_empty_to_null(t.hsdn_ymd) + ,medaca_common.convert_empty_to_null(t.exec_dt) + ,t.v_tran_cd + ,medaca_common.convert_empty_to_null(t.tran_kbn_name) + ,medaca_common.convert_empty_to_null(t.whs_org_cd) + ,t.v_whsorg_cd + ,medaca_common.convert_empty_to_null(t.whs_org_name) + ,medaca_common.convert_empty_to_null(t.whs_org_kn) + ,t.v_whs_cd + ,medaca_common.convert_empty_to_null(t.whs_name) + ,medaca_common.convert_empty_to_null(t.nonyu_fcl_cd) + ,nullif(t.v_inst_cd,'') + ,nullif(t.v_inst_name,'') + ,nullif(t.v_inst_kn,'') + ,nullif(t.v_inst_addr,'') + ,nullif(t.comm_cd,'') + ,nullif(t.product_name,'') + ,nullif(t.htdnymd_err_kbn,'') + ,nullif(t.prd_exis_kbn,'') + ,nullif(t.fcl_exis_kbn,'') + ,t.qty1 + ,t.qty2 + ,t.qty3 + ,t.slip_org_kbn + ,medaca_common.convert_empty_to_null(t.bef_slip_mgt_num) + ,medaca_common.convert_empty_to_null(t.whs_rep_comm_name) + ,medaca_common.convert_empty_to_null(t.whs_rep_nonyu_fcl_name) + ,medaca_common.convert_empty_to_null(t.whs_rep_nonyu_fcl_addr) + ,medaca_common.convert_empty_to_null(t.err_flg1) + ,medaca_common.convert_empty_to_null(t.err_flg2) + ,medaca_common.convert_empty_to_null(t.err_flg3) + ,medaca_common.convert_empty_to_null(t.err_flg4) + ,medaca_common.convert_empty_to_null(t.err_flg5) + ,medaca_common.convert_empty_to_null(t.err_flg6) + ,medaca_common.convert_empty_to_null(t.err_flg7) + ,medaca_common.convert_empty_to_null(t.err_flg8) + ,medaca_common.convert_empty_to_null(t.err_flg9) + ,medaca_common.convert_empty_to_null(t.err_flg10) + ,medaca_common.convert_empty_to_null(t.err_flg11) + ,medaca_common.convert_empty_to_null(t.err_flg12) + ,medaca_common.convert_empty_to_null(t.err_flg13) + ,medaca_common.convert_empty_to_null(t.err_flg14) + ,medaca_common.convert_empty_to_null(t.err_flg15) + ,medaca_common.convert_empty_to_null(t.err_flg16) + ,medaca_common.convert_empty_to_null(t.err_flg17) + ,medaca_common.convert_empty_to_null(t.err_flg18) + ,medaca_common.convert_empty_to_null(t.err_flg19) + ,medaca_common.convert_empty_to_null(t.err_flg20) + ,medaca_common.convert_empty_to_null(t.kjyo_ym) + ,medaca_common.convert_empty_to_null(t.tksnbk_kbn) + ,medaca_common.convert_empty_to_null(t.fcl_exec_kbn) + ,medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,medaca_common.convert_empty_to_null(t.ins_usr) + ,SYSDATE() + FROM org05.bio_sales AS t + ON DUPLICATE KEY UPDATE + rec_data=medaca_common.convert_empty_to_null(t.rec_data) + ,rec_whs_cd=medaca_common.convert_empty_to_null(t.rec_whs_cd) + ,rec_whs_sub_cd=medaca_common.convert_empty_to_null(t.rec_whs_sub_cd) + ,rec_whs_org_cd=medaca_common.convert_empty_to_null(t.rec_whs_org_cd) + ,rec_cust_cd=medaca_common.convert_empty_to_null(t.rec_cust_cd) + ,rec_comm_cd=medaca_common.convert_empty_to_null(t.rec_comm_cd) + ,rec_tran_kbn=medaca_common.convert_empty_to_null(t.rec_tran_kbn) + ,rev_hsdnymd_wrk=medaca_common.convert_empty_to_null(t.rev_hsdnymd_wrk) + ,rev_hsdnymd_srk=medaca_common.convert_empty_to_null(t.rev_hsdnymd_srk) + ,rec_urag_num=medaca_common.convert_empty_to_null(t.rec_urag_num) + ,rec_comm_name=medaca_common.convert_empty_to_null(t.rec_comm_name) + ,rec_nonyu_fcl_name=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_name) + ,rec_nonyu_fcl_addr=medaca_common.convert_empty_to_null(t.rec_nonyu_fcl_addr) + ,rec_lot_num1=medaca_common.convert_empty_to_null(t.rec_lot_num1) + ,rec_qty1=medaca_common.convert_empty_to_null(t.rec_qty1) + ,rec_lot_num2=medaca_common.convert_empty_to_null(t.rec_lot_num2) + ,rec_qty2=medaca_common.convert_empty_to_null(t.rec_qty2) + ,rec_lot_num3=medaca_common.convert_empty_to_null(t.rec_lot_num3) + ,rec_qty3=medaca_common.convert_empty_to_null(t.rec_qty3) + ,rec_ymd=medaca_common.convert_empty_to_null(t.rec_ymd) + ,sale_data_cat=medaca_common.convert_empty_to_null(t.sale_data_cat) + ,slip_file_name=medaca_common.convert_empty_to_null(t.slip_file_name) + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,hsdn_ymd=medaca_common.convert_empty_to_null(t.hsdn_ymd) + ,exec_dt=medaca_common.convert_empty_to_null(t.exec_dt) + ,v_tran_cd=t.v_tran_cd + ,tran_kbn_name=medaca_common.convert_empty_to_null(t.tran_kbn_name) + ,whs_org_cd=medaca_common.convert_empty_to_null(t.whs_org_cd) + ,v_whsorg_cd=t.v_whsorg_cd + ,whs_org_name=medaca_common.convert_empty_to_null(t.whs_org_name) + ,whs_org_kn=medaca_common.convert_empty_to_null(t.whs_org_kn) + ,v_whs_cd=t.v_whs_cd + ,whs_name=medaca_common.convert_empty_to_null(t.whs_name) + ,nonyu_fcl_cd=medaca_common.convert_empty_to_null(t.nonyu_fcl_cd) + ,v_inst_cd=nullif(t.v_inst_cd,'') + ,v_inst_name=nullif(t.v_inst_name,'') + ,v_inst_kn=nullif(t.v_inst_kn,'') + ,v_inst_addr=nullif(t.v_inst_addr,'') + ,comm_cd=nullif(t.comm_cd,'') + ,product_name=nullif(t.product_name,'') + ,htdnymd_err_kbn=nullif(t.htdnymd_err_kbn,'') + ,prd_exis_kbn=nullif(t.prd_exis_kbn,'') + ,fcl_exis_kbn=nullif(t.fcl_exis_kbn,'') + ,qty1=t.qty1 + ,qty2=t.qty2 + ,qty3=t.qty3 + ,slip_org_kbn=t.slip_org_kbn + ,bef_slip_mgt_num=medaca_common.convert_empty_to_null(t.bef_slip_mgt_num) + ,whs_rep_comm_name=medaca_common.convert_empty_to_null(t.whs_rep_comm_name) + ,whs_rep_nonyu_fcl_name=medaca_common.convert_empty_to_null(t.whs_rep_nonyu_fcl_name) + ,whs_rep_nonyu_fcl_addr=medaca_common.convert_empty_to_null(t.whs_rep_nonyu_fcl_addr) + ,err_flg1=medaca_common.convert_empty_to_null(t.err_flg1) + ,err_flg2=medaca_common.convert_empty_to_null(t.err_flg2) + ,err_flg3=medaca_common.convert_empty_to_null(t.err_flg3) + ,err_flg4=medaca_common.convert_empty_to_null(t.err_flg4) + ,err_flg5=medaca_common.convert_empty_to_null(t.err_flg5) + ,err_flg6=medaca_common.convert_empty_to_null(t.err_flg6) + ,err_flg7=medaca_common.convert_empty_to_null(t.err_flg7) + ,err_flg8=medaca_common.convert_empty_to_null(t.err_flg8) + ,err_flg9=medaca_common.convert_empty_to_null(t.err_flg9) + ,err_flg10=medaca_common.convert_empty_to_null(t.err_flg10) + ,err_flg11=medaca_common.convert_empty_to_null(t.err_flg11) + ,err_flg12=medaca_common.convert_empty_to_null(t.err_flg12) + ,err_flg13=medaca_common.convert_empty_to_null(t.err_flg13) + ,err_flg14=medaca_common.convert_empty_to_null(t.err_flg14) + ,err_flg15=medaca_common.convert_empty_to_null(t.err_flg15) + ,err_flg16=medaca_common.convert_empty_to_null(t.err_flg16) + ,err_flg17=medaca_common.convert_empty_to_null(t.err_flg17) + ,err_flg18=medaca_common.convert_empty_to_null(t.err_flg18) + ,err_flg19=medaca_common.convert_empty_to_null(t.err_flg19) + ,err_flg20=medaca_common.convert_empty_to_null(t.err_flg20) + ,kjyo_ym=medaca_common.convert_empty_to_null(t.kjyo_ym) + ,tksnbk_kbn=medaca_common.convert_empty_to_null(t.tksnbk_kbn) + ,fcl_exec_kbn=medaca_common.convert_empty_to_null(t.fcl_exec_kbn) + ,rec_sts_kbn=medaca_common.convert_empty_to_null(t.rec_sts_kbn) + ,ins_dt=nullif(t.ins_dt, 0) + ,ins_usr=medaca_common.convert_empty_to_null(t.ins_usr) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + + # ロットマスタデータ + CONDKEY_LOT_NUM_MST: { + _KEY_DATA_NAME: "ロットマスタデータ", + _KEY_FILE_PREFIX: "lot_num_mst_", + _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "5", + _KEY_ORG_TABLE: "org05.lot_num_mst", + _KEY_SRC_TABLE: "src05.lot_num_mst", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.lot_num_mst ( + ser_num + ,lot_num + ,expr_dt + ,frst_mov_dt + ,ins_dt + ,ins_usr + ,dwh_upd_dt + ) + SELECT + t.ser_num + ,t.lot_num + ,t.expr_dt + ,t.frst_mov_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,medaca_common.convert_empty_to_null(t.ins_usr) + ,SYSDATE() + FROM org05.lot_num_mst AS t + ON DUPLICATE KEY UPDATE + ser_num=t.ser_num + ,lot_num=t.lot_num + ,expr_dt=t.expr_dt + ,frst_mov_dt=t.frst_mov_dt + ,ins_dt=nullif(t.ins_dt, 0) + ,ins_usr=medaca_common.convert_empty_to_null(t.ins_usr) + ,dwh_upd_dt=SYSDATE() + ; + """) + }, + } + + def _get_interface_property(self, condkey: str, property_name: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(property_name) + return ret + + def get_data_name(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル論理名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_DATA_NAME) + + def get_file_prefix(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル名接頭辞を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_FILE_PREFIX) + + def get_file_suffix(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル拡張子を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_FILE_SUFFIX) + + def get_file_column_separators(self, condkey: str) -> int: + """ + 概要 + 受領ファイルI/Fが想定する、1行あたりのタブ文字数を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return int(self._get_interface_property(condkey, self._KEY_FILE_COLUMN_SEPARATORS)) + + def get_org_table(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、LOAD先ロードスキーマテーブル名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_ORG_TABLE) + + def get_src_table(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、登録先蓄積スキーマテーブル名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_SRC_TABLE) + + def get_upsert_sql(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、upsert (ロードスキーマ→蓄積スキーマ) CMLステートメントを取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ + return self._get_interface_property(condkey, self._KEY_UPSERT_SQL) + + def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: + """ + 概要 + S3受領バケットに受領したファイル名から、I/F想定に該当する condkey 値を取得する + 引数 + s3_file_path: S3受領バケットにある受領したファイルパス + """ + ret = None + filename = s3_file_path[s3_file_path.rfind("/") + 1:] + for condkey in self._VJSK_INTERFACE_MAPPING: + element = self._VJSK_INTERFACE_MAPPING.get(condkey) + if filename.startswith(element.get(self._KEY_FILE_PREFIX)) \ + and filename.endswith(element.get(self._KEY_FILE_SUFFIX)): + ret = condkey + break + return ret diff --git a/ecs/jskult-batch-daily/src/db/__init__.py b/ecs/jskult-batch-daily/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py new file mode 100644 index 00000000..5ddaba4e --- /dev/null +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -0,0 +1,195 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __transactional_engine: Engine = None + __autocommit_engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __autocommit: bool = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str, autocommit: bool = False) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + autocommit(bool): 自動コミットモードで接続するかどうか(Trueの場合、トランザクションの有無に限らず即座にコミットされる). Defaults to False. + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + self.__autocommit = autocommit + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4", "local_infile": "1"}, + ) + + self.__transactional_engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + self.__autocommit_engine = self.__transactional_engine.execution_options(isolation_level='AUTOCOMMIT') + + @classmethod + def get_instance(cls, autocommit=False): + """インスタンスを取得します + + Args: + autocommit (bool, optional): 自動コミットモードで接続するかどうか(Trueの場合、トランザクションの有無に限らず即座にコミットされる). Defaults to False. + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA, + autocommit=autocommit + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。\n + インスタンスのautocommitがTrueの場合、自動コミットモードで接続する。(明示的なトランザクションも無視される) + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = ( + self.__autocommit_engine.connect() if self.__autocommit is True + else self.__transactional_engine.connect()) + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def to_jst(self): + self.execute('SET time_zone = "+9:00"') + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-batch-daily/src/error/__init__.py b/ecs/jskult-batch-daily/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/error/exceptions.py b/ecs/jskult-batch-daily/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py new file mode 100644 index 00000000..313d6c29 --- /dev/null +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -0,0 +1,135 @@ +"""実消化&アルトマーク 日次バッチ処理""" + +from src.aws.s3 import ConfigBucket +from src.batch import parallel_processes +from src.batch.batch_functions import ( + get_batch_statuses, update_batch_process_complete, + update_batch_processing_flag_in_processing) +from src.batch.common.batch_context import BatchContext +from src.batch.common.calendar_file import CalendarFile +from src.batch.dcf_inst_merge import create_dcf_inst_merge +from src.batch.laundering import mst_inst_laundering +from src.batch.ultmarc import output_vjsk_inst_pharm_data, ultmarc_process +from src.batch.vjsk import vjsk_importer +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants + +logger = get_logger('日次処理コントロール') + +# バッチ共通設定を取得 +batch_context = BatchContext.get_instance() + + +def exec(): + try: + logger.info('日次バッチ:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() + except BatchOperationException as e: + logger.exception(f'日付テーブル取得(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 日次バッチ処理中の場合、後続の処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('日次バッチ処理中のため、日次バッチ処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump取得が正常終了していない場合、後続の処理は行わない + if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: + logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + logger.info(f'処理日={syor_date}') + # バッチ共通設定に処理日を追加 + batch_context.syor_date = syor_date + + # 稼働日かどうかを、V実消化非稼働日ファイルをダウンロードして判定 + try: + holiday_list_file_path = ConfigBucket().download_holiday_list() + holiday_calendar = CalendarFile(holiday_list_file_path) + batch_context.is_not_business_day = holiday_calendar.compare_date(syor_date) + except Exception as e: + logger.exception(f'V実消化非稼働日ファイルの読み込みに失敗しました。{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 調査目的でV実消化稼働日かどうかをログ出力 + logger.debug(f'本日は{"V実消化非稼働日です。" if batch_context.is_not_business_day else "V実消化稼働日です。"}') + + # バッチ処理中に更新 + try: + update_batch_processing_flag_in_processing() + except BatchOperationException as e: + logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + try: + logger.info('アルトマーク取込:起動') + ultmarc_process.exec_import() + logger.info('アルトマーク取込:終了') + except BatchOperationException as e: + logger.exception(f'アルトマーク取込処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 調査目的でアルトマーク取込が行われたかどうかをログ出力 + logger.debug(f'{"アルトマーク取込が行われました。" if batch_context.is_ultmarc_imported else "アルトマーク取込が行われませんでした。"}') + + try: + logger.info('V実消化用施設データ作成処理:起動') + output_vjsk_inst_pharm_data.exec() + logger.info('V実消化用施設データ作成処理:終了') + except BatchOperationException as e: + logger.exception(f'V実消化用施設データ作成処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + logger.info('日次処理(V実消化)') + try: + logger.info('V実消化取込:起動') + vjsk_importer.exec() + logger.info('V実消化取込:終了') + except BatchOperationException as e: + logger.exception(f'V実消化取込処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + try: + logger.info('メルク施設マスタ作成:起動') + mst_inst_laundering.exec() + logger.info('メルク施設マスタ作成:終了') + except BatchOperationException as e: + logger.exception(f'メルク施設マスタ作成 エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + try: + # 実績生物由来ロット分解と並列処理 + logger.info('並列処理(実績更新-生物由来ロット分解):起動') + parallel_processes.exec() + logger.info('並列処理(実績更新-生物由来ロット分解):終了') + except BatchOperationException as e: + logger.exception(f'並列処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + try: + logger.info('DCF施設統合マスタ作成:起動') + create_dcf_inst_merge.exec() + logger.info('DCF施設統合マスタ作成:終了') + except BatchOperationException as e: + logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 + logger.info('業務日付更新・バッチステータスリフレッシュ:起動') + try: + update_batch_process_complete() + except BatchOperationException as e: + logger.exception(f'業務日付更新・バッチステータスリフレッシュ エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('業務日付更新・バッチステータスリフレッシュ:終了') + + # 正常終了を保守ユーザーに通知 + logger.info('[NOTICE]日次バッチ:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') + raise e diff --git a/ecs/jskult-batch-daily/src/logging/get_logger.py b/ecs/jskult-batch-daily/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-batch-daily/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-batch-daily/src/system_var/__init__.py b/ecs/jskult-batch-daily/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/system_var/constants.py b/ecs/jskult-batch-daily/src/system_var/constants.py new file mode 100644 index 00000000..8a0ccbb3 --- /dev/null +++ b/ecs/jskult-batch-daily/src/system_var/constants.py @@ -0,0 +1,17 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:dump取得正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' + +# カレンダーファイルのコメントシンボル +CALENDAR_COMMENT_SYMBOL = '#' + +# 月曜日(datetime.weekday()で月曜日を表す数字) +WEEKDAY_MONDAY = 0 diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py new file mode 100644 index 00000000..0af7a118 --- /dev/null +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -0,0 +1,38 @@ +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'] + +# AWS +ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] +ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] +VJSK_BACKUP_FOLDER = os.environ['VJSK_BACKUP_FOLDER'] +JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] +JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] +VJSK_DATA_SEND_FOLDER = os.environ['VJSK_DATA_SEND_FOLDER'] +VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME'] +JSKULT_CONFIG_CONVERT_FOLDER = os.environ['JSKULT_CONFIG_CONVERT_FOLDER'] +JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME = os.environ['JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME'] +VJSK_DATA_RECEIVE_FOLDER = os.environ['VJSK_DATA_RECEIVE_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)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD = int(os.environ['SALES_LAUNDERING_EXTRACT_DATE_PERIOD']) +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME = os.environ['SALES_LAUNDERING_TARGET_TABLE_NAME'] +# 卸実績洗替で作成するデータの期間(年単位) +SALES_LAUNDERING_TARGET_YEAR_OFFSET = os.environ['SALES_LAUNDERING_TARGET_YEAR_OFFSET'] diff --git a/ecs/jskult-batch-daily/src/time/elapsed_time.py b/ecs/jskult-batch-daily/src/time/elapsed_time.py new file mode 100644 index 00000000..c1432e91 --- /dev/null +++ b/ecs/jskult-batch-daily/src/time/elapsed_time.py @@ -0,0 +1,22 @@ +import time + + +class ElapsedTime: + """処理実行時間計測クラス""" + def __init__(self) -> None: + """このクラスの新たなインスタンスを初期化します。""" + self.__start = time.perf_counter() + + @property + def of(self): + """インスタンス化してからの経過時間をhh:mm:ssの形式にフォーマットして返す + Returns: + str: 時分秒形式の経過時間 + """ + elapsed_time = time.perf_counter() - self.__start + h, rem = divmod(elapsed_time, 3600) + m, s = divmod(rem, 60) + h_str = f'{h:02.0f} hour ' if h > 0.0 else '' + m_str = f'{m:02.0f} min ' if m > 0.0 else '' + s_str = f'{s:06.02f} sec' if s > 0.0 else '' + return f"{h_str}{m_str}{s_str}" diff --git a/ecs/jskult-batch-daily/tests/__init__.py b/ecs/jskult-batch-daily/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/__init__.py b/ecs/jskult-batch-daily/tests/batch/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv new file mode 100644 index 00000000..a437f7df --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv @@ -0,0 +1,7 @@ +"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","群馬大" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv new file mode 100644 index 00000000..4f37bb30 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv @@ -0,0 +1,6 @@ +"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","福島医" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv new file mode 100644 index 00000000..0599c239 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv @@ -0,0 +1,7 @@ +"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","神大" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv new file mode 100644 index 00000000..2aa73354 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","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" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 11:35:27","clsComAlma" +"005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"006","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv new file mode 100644 index 00000000..5284785e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","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" +"001","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"002","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"003","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"005","東北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"006","福島医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv new file mode 100644 index 00000000..6cb36d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv @@ -0,0 +1,8 @@ +"alma_cd","alma","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" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"006","福島医","20171020","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"007","群馬大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:43:15","com_alma_mapper","2017/10/20 10:43:15","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv new file mode 100644 index 00000000..8fafdb5f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","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" +"001","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"002","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"003","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"005","東北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"006","福島医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv new file mode 100644 index 00000000..f25889be --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv @@ -0,0 +1,8 @@ +"alma_cd","alma","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" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","com_alma_mapper" +"005","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"007","神大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:35:27","com_alma_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py new file mode 100644 index 00000000..8390096f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComAlmaMapper: + """レイアウト区分004: COM_出身校""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_insert.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_出身校テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + 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_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_update.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_出身校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + 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_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_delete.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv new file mode 100644 index 00000000..430eb8d2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv @@ -0,0 +1,7 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","","8","21" +"003","003","1","A","20141113","20141114","岩手医","8","21" +"003","004","1","C","20141113","20141114","弘大","8","21" +"003","004","2","A","20141113","20141114","岩手医","4","19" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv new file mode 100644 index 00000000..3525f111 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv @@ -0,0 +1,7 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","札幌医","3","20" +"003","003","1","A","20141113","20141114","弘大","3","19" +"003","004","1","A","20141113","20141114","岩手医","3","03" +"003","999","9","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお","1","99" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv new file mode 100644 index 00000000..7f9d64aa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv @@ -0,0 +1,6 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","","8","21" +"003","003","1","A","20141113","20141114","岩手医","8","21" +"003","004","1","A","20141113","20141114","弘大","8","21" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv new file mode 100644 index 00000000..9b7b0649 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv @@ -0,0 +1,7 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","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" +"001","1","1","09","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"001","2","3","40","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"001","3","3","42","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"002","1","8","21","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"003","1","8","21","岩手医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"004","1","8","21","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv new file mode 100644 index 00000000..64e33084 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","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" +"001","1","1","09","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"001","2","3","40","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"001","3","3","42","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"002","1","3","20","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"003","1","3","19","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"004","1","3","03","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv new file mode 100644 index 00000000..9774279b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","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" +"001","1","1","09","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"002","1","8","21","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"003","1","8","21","岩手医","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"004","1","8","21","弘大","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"004","2","4","19","岩手医","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 10:22:05","com_alma_depart_disc_mapper","2023/05/14 10:22:05","com_alma_depart_disc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv new file mode 100644 index 00000000..23c77252 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","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" +"001","1","1","09","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"002","1","3","20","札幌医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"003","1","3","19","弘大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"004","1","3","03","岩手医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv new file mode 100644 index 00000000..69a09486 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","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" +"001","1","1","09","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"002","1","8","21","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"003","1","8","21","岩手医","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"004","1","8","21","弘大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py new file mode 100644 index 00000000..b3881eac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py @@ -0,0 +1,236 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_depart_disc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComAlmaDepartDiscMapper: + """レイアウト区分003: COM_出身校学部識別""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校学部識別テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_insert.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_出身校学部識別テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_depart_disc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma_depart_disc', + 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_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_update.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_出身校学部識別テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_depart_disc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma_depart_disc', + 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_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_delete.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv new file mode 100644 index 00000000..cbeb7eae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv @@ -0,0 +1,7 @@ +"008","0067","A","20141113","20141114","","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","2","L81","010" +"008","0070","C","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A08","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","020" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" +"008","0073","A","20141113","20141114","内科(内分泌・代謝)","ナイカ(ナイブンピ.タイシヤ)","1","A05","144" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv new file mode 100644 index 00000000..f9a527d2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv @@ -0,0 +1,7 @@ +"008","0067","A","20141113","20141114","消化器内科・血液内科","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワナイカ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","1","L81","010" +"008","0070","A","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A07","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","019" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" +"008","9999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオアイウエオアイウエオアイウエオアイウ","9","999","999" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv new file mode 100644 index 00000000..b2aff05b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv @@ -0,0 +1,6 @@ +"008","0067","A","20141113","20141114","","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","2","L81","010" +"008","0070","A","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A08","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","020" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv new file mode 100644 index 00000000..6637e500 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv @@ -0,0 +1,7 @@ +"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" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20171024","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0068","カンワ","緩和内科","20171024","20171024","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20171024","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20171024","NULL","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20171024","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20171024","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv new file mode 100644 index 00000000..9e3d6b55 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv @@ -0,0 +1,8 @@ +"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" +"0067","シヨウカキナイカ.ケツエキナイカ","消化器内科・血液内科","20171024","NULL","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0068","カンワナイカ","緩和内科","20171024","NULL","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","NULL","NULL","1","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","NULL","NULL","1","A07","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","NULL","NULL","1","A06","019","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"9999","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv new file mode 100644 index 00000000..445e496f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv @@ -0,0 +1,8 @@ +"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" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20230515","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0068","カンワ","緩和内科","20171024","20230515","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20230515","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20171024","20230515","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20230515","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20230515","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0073","ナイカ(ナイブンピ.タイシヤ)","内科(内分泌・代謝)","20230515","NULL","NULL","1","A05","144","NULL","NULL","NULL","NULL","2023/05/15 11:10:31","com_blng_sec_mapper","2023/05/15 11:10:31","com_blng_sec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv new file mode 100644 index 00000000..501d4cdb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv @@ -0,0 +1,8 @@ +"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" +"0067","シヨウカキナイカ.ケツエキナイカ","消化器内科・血液内科","20230515","NULL","NULL","1","A02","117","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0068","カンワナイカ","緩和内科","20230515","NULL","NULL","1","A79","030","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20230515","NULL","NULL","1","L81","010","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20230515","NULL","NULL","1","A07","052","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20230515","NULL","NULL","1","A06","019","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20230515","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"9999","アイウエオアイウエオアイウエオアイウエオアイウ","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","9","999","999","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv new file mode 100644 index 00000000..9743e740 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv @@ -0,0 +1,8 @@ +"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" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20230515","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0068","カンワ","緩和内科","20171024","20230515","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20230515","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20230515","NULL","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20230515","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20230515","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"9999","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py new file mode 100644 index 00000000..4825682e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_blng_sec_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComBlngSecMapper: + """レイアウト区分008: COM_所属部科""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_所属部科テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_insert.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_所属部科テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_update.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_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_update.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_所属部科テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + 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_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_delete.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv new file mode 100644 index 00000000..bc912e04 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv @@ -0,0 +1,3 @@ +"112","00","9901649","","B","00","1101813","","2013","1","20170328","20170401","" +"112","00","9904439","","B","00","1101135","","2013","1","20170328","20170401","" +"112","00","9904439","","B","00","1101717","","2013","1","20170328","20170401","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv new file mode 100644 index 00000000..37706281 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv @@ -0,0 +1,7 @@ +"112","00","9901649","","A","00","1101813","","2013","2","20141113","20141114","1" +"112","00","9901649","","A","00","1101813","","2014","2","20141113","20141114","1" +"112","00","9904439","","A","00","1101135","","2013","2","20141113","20141114","2" +"112","00","9904439","","A","00","1101135","","2014","2","20141113","20141114","2" +"112","00","9904439","","A","00","1101717","","2013","2","20141113","20141114","1" +"112","00","9904439","","A","00","1101717","","2014","2","20141113","20141114","1" +"112","99","9999999","99","A","11","1111111","11","2023","0","20141113","20141114","1" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv new file mode 100644 index 00000000..cecbf3a3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv @@ -0,0 +1,4 @@ +"112","00","9901649","","B","00","1101813","","2013","3","20141113","20141114","1" +"112","00","9901649","","B","00","1101813","","2014","4","20141113","20141114","1" +"112","99","9999999","99","B","11","1111111","11","2014","4","20141113","20141114","123" +"112","99","9999999","00","B","11","1111111","11","2014","4","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv new file mode 100644 index 00000000..536cd1c2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009901649","001101813","2014","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv new file mode 100644 index 00000000..42519300 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009901649","001101813","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999999","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999900","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv new file mode 100644 index 00000000..efcda970 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2014","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv new file mode 100644 index 00000000..8864ba3f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009901649","001101813","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"99999999999","11111111111","2023","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv new file mode 100644 index 00000000..0ab83cfa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:49:28","com_cop_hp_mapper" +"009901649","001101813","2014","NULL","1","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:49:28","com_cop_hp_mapper" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999999","11111111111","2014","NULL","123","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:57:12","com_cop_hp_mapper" +"99999999900","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py new file mode 100644 index 00000000..553c4261 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py @@ -0,0 +1,250 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_cop_hp_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComCopHpMapper: + """レイアウト区分112: COM_臨床研修病院""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_臨床研修病院テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_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_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_臨床研修病院テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_cop_hp_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_cop_hp', + 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_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_臨床研修病院テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_cop_hp_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_cop_hp', + 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_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_cop_hp')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv new file mode 100644 index 00000000..6b3b6b3c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv @@ -0,0 +1,6 @@ +"501","01","222222","33","C","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","01","994301","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","997906","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","995783","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","999613","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","997682","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv new file mode 100644 index 00000000..383ecb75 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv @@ -0,0 +1,7 @@ +"501","01","222222","33","A","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","01","994301","00","A","20141113","20141114",,,,,"菅間 正気","カンマ セイキ","1","3","16","01","14","37","37","3","44","011","1","3","44","A01","C01","I01","K01","C04",,"14","104","094","000","231-0862","神奈川県横浜市中区山手町126-1 クレスト山手306","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","126-1-306","04","05","03","00","08","10","07","00","045-625-2067",,,,,"1",,, +"501","01","995783","00","A","20141113","20141114",,,,,"船越 正信","フナコシ マサノブ","1","3","29","01","06","53","55","3","53","039","1","3","53","A01","L01","E02","C04","L03","7","00","000","000","000",,,,,"00","00","00","00","00","00","00","00",,"02","A05","20051003",,"2",,, +"501","01","997682","00","A","20141113","20141114",,,,,"川崎 三紀子","カワサキ ミキコ","2","3","46","10","03","99","99","4","11","057","1","4","11","A01","A58",,,,,"13","119","047","000","173-0001","東京都板橋区本町6-3-301","トウキヨウト イタバシク ホンチヨウ 6-3-301","6-3-301","03","03","02","00","07","07","06","00","03-3579-1698",,,,,"2",,,"1" +"501","01","997906","00","A","20141113","20141114",,,,,"丘 守正","オカ モリマサ","1","3","20","03","11","99","31","3","45","799","1",,,"A01","L01","A31","A21","A11",,"08","221","095","000","312-0021","茨城県ひたちなか市大字三反田3892-4","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","3892-4","03","06","05","00","08","07","11","00","029-274-7110",,,,,"1","4","03", +"501","01","997907","00","A","20141113","20141114",,,,,"丘 守正","オカ モリマサ","1",,,"03","11","99","31","3","45","799","1",,,"","","","","",,"08","221","095","000","312-0021","茨城県ひたちなか市大字三反田3892-4","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","3892-4","03","06","05","00","08","07","11","00","029-274-7110",,,,,"1","4","03", +"501","01","997908","00","A","20141113","20141114","@","@","481065","00","藤堂 尚也","トウドウ ナオヤ","1","@","20","10","03","99","31","@","45","799","1","@","23","@","L01","E02","C04","L03","@","08","221","095","000","312-0021","茨城県ひたちなか市大字三反田3892-4","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","3892-4","03","06","05","00","08","07","11","00","@","@","@","@","@","1","@","03","1" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv new file mode 100644 index 00000000..09c509fb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv @@ -0,0 +1,9 @@ +"501","01","222222","33","A","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","99","999999","99","A","20230425","20230426","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","994301","00","B","20170911","20170912","","01","998099","00","","","2","","","","","","","","","022","2","","","@","","","","","","13","102","022","002","103-0013","東京都中央区日本橋人形町2-7-10-10","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","2-7-10-10","09","09","09","09","09","09","09","09","045-999-9999","03","B06","20160831","20161125","","","","1" +"501","01","995783","00","B","20170921","20170922","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","4","04","" +"501","01","997682","00","B","20170922","20170923","","","","","横浜 三紀子","ヨコハマ ミキコ","2","4","3","11","12","99","99","3","52","057","1","3","10","A01","A58","","","","","13","119","047","000","173-0001","東京都板橋区本町6-3-301","トウキヨウト イタバシク ホンチヨウ 6-3-301","6-3-301","03","03","02","00","07","07","06","00","03-3579-1698","","","","","2","","","1" +"501","01","997906","00","B","20170911","20170912","","","","","","","","@","","","","","","@","","","","","","U91","U92","U93","U94","U95","5","","","","","","","","","","","","","","","","","@","","","","","","@","","" +"501","01","999613","00","B","20170901","20170902","@","","","","","","","4","2","09","22","37","11","","","","","@","","","","","","","@","01","002","033","444","555-6666","神奈川県鎌倉市玉縄2-8-30","カナガワケン カマクラシ タマナワ 2-8-30","2-8-30","00","00","00","00","00","00","00","00","","","","","","","","","" +"501","99","999999","90","B","20230425","20230426","@","@","9","10","11","12","1","@","15","06","17","18","19","@","21","022","3","@","25","@","C27","I28","K29","L30","@","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","@","@","@","@","@","3","@","55","6" +"501","99","999999","00","A","20230425","20230426","","","","","","","","","","","","","","","","","","","","A01","","A03","","A05","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv new file mode 100644 index 00000000..6afe1981 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2−7−10−10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","NULL","NULL","NULL","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2−8−30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1","","","NULL","","0148106500","1","","","","","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv new file mode 100644 index 00000000..1c34701d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv @@ -0,0 +1,10 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaaa" +"9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-625-2067","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","神奈川県横浜市中区山手町126−1 クレスト山手306","231-0862","14104094000","14","104","126-1-306","08100700","04050300","37","1","1","","","011","1","3","44","1969","","NULL","1","","","","","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","","","NULL","","","","","00000000000","00","000","","00000000","00000000","55","2","1","","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199768200","カワサキ ミキコ","川崎 三紀子","3","46","10","03","19711003","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","4","11","1999","1","NULL","1","","","","","4","11","1999","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199961300","フジタ アカネ","藤田 茜","","","","","NULL","99","","","NULL","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","NULL","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"9999999990","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"9999999900","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv new file mode 100644 index 00000000..cf12270f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv @@ -0,0 +1,15 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L03","0199578300","5","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L01","0199578300","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"E02","0199578300","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"C04","0199578300","4","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"A58","0199768200","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"A01","0199768200","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U91","0199790600","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U92","0199790600","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U93","0199790600","3","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U94","0199790600","4","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U95","0199790600","5","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv new file mode 100644 index 00000000..f2497d92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv @@ -0,0 +1,2 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv new file mode 100644 index 00000000..cf4d0ac7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv @@ -0,0 +1,16 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999900","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"U91","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U92","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U93","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U94","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U95","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv new file mode 100644 index 00000000..c11243ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv @@ -0,0 +1,6 @@ +era_cd","era_name","year","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","明治","1867","2014/10/24 11:29:55","INIT ","2014/10/24 11:29:55","INIT ","2014/10/24 11:29:55","INIT","2014/10/24 11:29:55","INIT" +"2","大正","1911","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT","2014/10/24 11:29:56","INIT" +"3","昭和","1925","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT","2014/10/24 11:29:56","INIT" +"4","平成","1988","2014/10/24 11:29:57","INIT ","2014/10/24 11:29:57","INIT ","2014/10/24 11:29:57","INIT","2014/10/24 11:29:57","INIT" +"5","令和","2018","2019/05/07 10:27:29","dwh_supp","2019/05/07 10:27:29","dwh_supp","2019/05/07 10:27:29","dwh_support","2019/05/07 10:27:29","dwh_support" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv new file mode 100644 index 00000000..94734929 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","20230425","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2−7−10−10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","NULL","NULL","NULL","","NULL","1","","","","","","","NULL","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2−8−30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1","","","NULL","","0148106500","1","","","","","NULL","NULL","NULL","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv new file mode 100644 index 00000000..3d251803 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv @@ -0,0 +1,8 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37",,,,"045-625-2067","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","神奈川県横浜市中区山手町126-1 クレスト山手306","231-0862","14104094000","14","104","126-1-306","08100700","04050300","37","1","1",,,"011","1","3","44","1969",,,"1",,,,,"3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53",,,,,,,,"00000000000","00","000",,"00000000","00000000","55","2","1",,"7","039","1","3","53","1978",,,"1","02","A05","20051003",,"3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199768200","カワサキ ミキコ","川崎 三紀子","3","46","10","03","19711003","99",,,,"03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2",,,"057","1","4","11","1999","1",,"1",,,,,"4","11","1999","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892-4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1",,,"799","1","3","45","1970",,,"1",,,,,,,,"NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199790700","オカ モリマサ","丘 守正",,,"03","11"," 0311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892-4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1",,,"799","1","3","45","1970",,,"1",,,,,,,,"NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199790800","トウドウ ナオヤ","藤堂 尚也","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892-4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","NULL","NULL","799","1","NULL","NULL","NULL","1","NULL","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv new file mode 100644 index 00000000..900ee683 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv @@ -0,0 +1,15 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"A01","0199768200","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A58","0199768200","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"C04","0199578300","4","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"E02","0199578300","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L03","0199578300","5","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L01","0199578300","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"U91","0199790600","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U92","0199790600","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U93","0199790600","3","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U94","0199790600","4","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U95","0199790600","5","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv new file mode 100644 index 00000000..eb819263 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv @@ -0,0 +1,23 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0199430100","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A11","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A21","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"A31","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C01","0199430100","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C04","0199430100","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C27","0122222233","2","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"I01","0199430100","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"I28","0122222233","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"K01","0199430100","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"K29","0122222233","4","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L01","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv new file mode 100644 index 00000000..6141d0cc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv @@ -0,0 +1,22 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"A01","9999999900","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A03","9999999900","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A05","9999999900","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"C27","0122222233","2","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"I28","0122222233","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"K29","0122222233","4","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"U91","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U92","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U93","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U94","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U95","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv new file mode 100644 index 00000000..24ac98c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv @@ -0,0 +1,9 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37",,,"NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2-7-10-10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2",,,"022","2","3","44","1969","1","0199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992",,,,,"00000000000","00","000",,"00000000","00000000","55","2","1","5","7","039","1","3","53","1978",,"NULL","1","02","A05","20051003",,"3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99",,,"NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2",,,"057","1","3","52","1977","1","NULL","1",,,,,"3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1",,"5","799","1","NULL","NULL","NULL",,"NULL","1",,,,,,,"NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37",,,"NULL",,"カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2-8-30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1",,,"NULL",,"0148106500","1",,,,,"NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"9999999990","12","11","NULL","NULL","NULL","NULL","NULL","18","NULL","NULL","NULL","NULL","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","NULL","NULL","022","3","NULL","NULL","NULL","6","NULL","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" +"9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py new file mode 100644 index 00000000..528a8ef1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -0,0 +1,370 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_dr_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComDrMapper: + """レイアウト区分501: COM_医師""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医師テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_insert.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + 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_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(医師) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_insert.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_insert.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_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] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_医師テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + 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_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(医師) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_update.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_update.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_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] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_logical_delete(self): + """ + Cases: + COM_医師テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + 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_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_delete.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_delete.csv')) + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_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] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv new file mode 100644 index 00000000..4e125d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv @@ -0,0 +1,9 @@ +"521","01","994301","00","B","027","1","20160826","20160903","" +"521","01","995783","00","B","027","1","20160826","20160903","" +"521","01","997682","00","B","027","1","20160826","20160903","" +"521","01","997906","00","B","008","1","20170331","20170408","" +"521","01","997906","00","B","223","1","20170407","20170415","" +"521","01","997906","00","B","116","1","20170407","20170415","" +"521","01","999613","00","B","027","1","20170414","20170422","" +"521","01","999613","00","B","223","1","20170414","20170422","" +"521","01","999999","00","B","999","1","20170414","20170422","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv new file mode 100644 index 00000000..7ef35de9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv @@ -0,0 +1,10 @@ +"521","01","994301","00","A","027","2","20141113","20141114","2003" +"521","01","994301","00","A","223","2","20141113","20141114","2002" +"521","01","995783","00","A","027","2","20141113","20141114","2003" +"521","01","997682","00","A","027","2","20141113","20141114","2014" +"521","01","997906","00","A","027","2","20141113","20141114","2003" +"521","01","997906","00","A","116","2","20141113","20141114","2002" +"521","01","997906","00","A","223","2","20141113","20141114","2002" +"521","01","999613","00","A","027","2","20141113","20141114","2003" +"521","01","999613","00","A","223","2","20141113","20141114","2002" +"521","01","999999","99","A","999","2","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv new file mode 100644 index 00000000..b592b065 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv @@ -0,0 +1,3 @@ +"521","01","994301","00","B","027","2","20170826","20170903","2016" +"521","01","997906","00","B","008","2","20161113","20161114","2003" +"521","01","999999","99","B","999","2","20161113","20161114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv new file mode 100644 index 00000000..22213e4a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv @@ -0,0 +1,11 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2016","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/11 21:20:37","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"008","0199790600","2003","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 14:00:03","clsComDrSosiety","2017/10/11 21:20:37","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv new file mode 100644 index 00000000..0de14d99 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv @@ -0,0 +1,11 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"999","0199999999","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv new file mode 100644 index 00000000..b614477b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv @@ -0,0 +1,3 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv new file mode 100644 index 00000000..d4efb0c6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv @@ -0,0 +1,10 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199578300","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199768200","2014","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199790600","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199961300","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"116","0199790600","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"223","0199430100","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"223","0199790600","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"999","0199999999","","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv new file mode 100644 index 00000000..a4b0381c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv @@ -0,0 +1,12 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"008","0199790600","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/09 14:00:03","com_dr_sosiety_mapper","2023/04/09 14:00:03","com_dr_sosiety_mapper" +"027","0199430100","2016","20171008","20230426","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2023/04/09 14:00:03","com_dr_sosiety_mapper" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"999","0199999999","","20171008","20230426","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2023/04/08 20:57:12","com_dr_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py new file mode 100644 index 00000000..4e8dbad8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py @@ -0,0 +1,244 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_dr_sosiety_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComDrSosietyMapper: + """レイアウト区分521: COM_所属学会""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_所属学会テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_insert.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_sosiety_cd, param_dcf_pcf_dr_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_所属学会テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_sosiety_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_sosiety', + 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_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_update.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_dcf_pcf_dr_cd, param_sosiety_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_所属学会テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_sosiety_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_sosiety', + 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_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_sosiety')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_dcf_pcf_dr_cd, param_sosiety_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv new file mode 100644 index 00000000..d23ec8cc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv @@ -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","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv new file mode 100644 index 00000000..80592c3a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv @@ -0,0 +1,11 @@ +"502","01","995783","","A","00","5414992","","2","20141113","20141114","501","","","","","" +"502","01","995783","","A","00","5507600","","2","20141113","20141114","133","144","9112","","","" +"502","01","997682","","A","00","5402984","","2","20141113","20141114","165","144","1512","","","" +"502","01","997682","","A","00","5408060","","2","20141113","20141114","","144","6802","","","" +"502","01","997682","","A","00","5412977","","2","20141113","20141114","","144","6720","","","" +"502","01","997906","","A","00","5409446","","2","20141113","20141114","501","","1118","","","" +"502","01","997906","","A","00","5503358","","2","20141113","20141114","172","144","1118","","","" +"502","01","997906","","A","00","5504428","","2","20141113","20141114","","144","7212","","","" +"502","01","997906","","A","00","5507600","","2","20141113","20141114","","144","9114","","","" +"502","01","999613","","A","00","5504428","","2","20141113","20141114","","144","5140","","","" +"502","01","995784","","B","00","5507600","","2","20170907","20170910","@","@","@","@","@","@" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv new file mode 100644 index 00000000..5cc42095 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv @@ -0,0 +1,6 @@ +"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","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ","" +"502","01","999999","","B","00","5409446","","","20170906","20170910","","","","","","" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv new file mode 100644 index 00000000..d37f092e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv @@ -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" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv new file mode 100644 index 00000000..bb604b15 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv @@ -0,0 +1,9 @@ +"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","シヨウカキゲカ","消化器外科","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","シヨウカキゲカガク1","消化器外科学Ⅰ","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","シヨウカキゲカガク","消化器外科学","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","ケツエキナイカ","血液内科","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","ユケツ.サイボウチリヨウガク","輸血・細胞治療学","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2021-01-11 22:15:40","clsComBlngSec" +"5140","ヤクリガク","薬理学","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-22 22:23:47","clsComBlngSec" +"9112","ハツセイ.セイシヨクブモン","発生・生殖部門","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-01 22:23:53","clsComBlngSec" +"9114","サイボウイシヨクブモン","細胞移植部門","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-01 22:23:53","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv new file mode 100644 index 00000000..d2432eb9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv @@ -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" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv new file mode 100644 index 00000000..8113fcc1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv @@ -0,0 +1,12 @@ +"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" +"005409446","01999999","1118",,,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv new file mode 100644 index 00000000..c0621a43 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv @@ -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" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv new file mode 100644 index 00000000..4f5049a2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv @@ -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" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv new file mode 100644 index 00000000..905de5b4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv @@ -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","消化器外科学Ⅰ",,"20200229","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","ケツエキナイカ","血液内科",,"20200229","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","シヨウカキゲカガク","消化器外科学",,"20200229","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",,,,"20200229","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","ケツエキナイカ","血液内科",,"20200229","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" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv new file mode 100644 index 00000000..532fb48a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv @@ -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","20200229","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","シヨウカキゲカ","消化器外科",,"20200229","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","ヤクリガク","薬理学",,"20200229","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" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv new file mode 100644 index 00000000..ee6de463 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv @@ -0,0 +1,12 @@ +"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-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 14:54:00","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005507600","01995783","9112","133","144","2020-02-22","ハツセイ.セイシヨクブモン","発生・生殖部門",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005402984","01997682","1512","165","144","2020-02-22","シヨウカキゲカ","消化器外科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005507600","01995784","9999",,,"2020-02-22","NULL","NULL","NULL","2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv new file mode 100644 index 00000000..2a82f63e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -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-03-01","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-03-01","シヨウカキゲカ","消化器外科",,"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","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","ケツエキナイカ","血液内科","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-03-01","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"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" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py new file mode 100644 index 00000000..bd521ad1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -0,0 +1,390 @@ +import os.path as path + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_dr_wrkplace_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComDrWrkplaceMapper: + """レイアウト区分502: COM_DCF医師勤務先""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @ pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_DCF医師勤務先テーブルにレコードを登録する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを削除する + Expects: + - COM_医師勤務先の登録内容が期待値と一致すること + - COM_医師勤務先履歴にデータが登録されないこと + """ + + # Arrange + # 処理日設定 + # 適用開始日と同値になる + self.batch_context.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から削除 + # 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_blng_sec_before_insert.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_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 = """\ + 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 + """ + 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_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_医師勤務先履歴の取得 + # 取得できないこと + 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) == 0, '履歴が作成されていないこと' + + assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること' + + # 期待値検査 + 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_dr_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_context.syor_date = '2020/03/01' + # テスト用の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_context.syor_date = '2020/03/01' + # テスト用の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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv new file mode 100644 index 00000000..36459b1c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv @@ -0,0 +1,8 @@ +"022","11","A","20141113","20141114","" +"022","12","A","20141113","20141114","X線CT" +"022","13","A","20141113","20141114","CR" +"022","14","C","20141113","20141114","血管造影システム" +"022","15","A","20141113","20141114","アンガー型カメラ" +"022","16","A","20141113","20141114","SPECT" +"022","99","C",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" +"022","98","C","20141113","20141114","血管造影システム" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv new file mode 100644 index 00000000..fe5ae507 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv @@ -0,0 +1,7 @@ +"022","11","A","20141113","20141114","MRI" +"022","12","A","20141113","20141114","X線CT" +"022","13","A","20141113","20141114","CR" +"022","14","A","20141113","20141114","血管造影システム" +"022","15","A","20141113","20141114","SPECT" +"022","16","A","20141113","20141114","アンガー型カメラ" +"022","99","A",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv new file mode 100644 index 00000000..5ae8452f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv @@ -0,0 +1,7 @@ +"022","11","B","20141113","20141114","" +"022","12","B","20141113","20141114","X線CT" +"022","13","B","20141113","20141114","CR" +"022","14","B","20141113","20141114","血管造影システム" +"022","15","B","20141113","20141114","アンガー型カメラ" +"022","16","B","20141113","20141114","SPECT" +"022","99","B",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv new file mode 100644 index 00000000..e9b7e50d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv @@ -0,0 +1,8 @@ +"forfront_med_equip_cd","forfront_med_equip_name","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" +"11","MRI","20171023","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","clsComForfrontMedEqu" +"12","X線CT","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"13","CR","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"14","血管造影システム","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"15","アンガー型カメラ","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"16","SPECT","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv new file mode 100644 index 00000000..716c01cc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv @@ -0,0 +1,9 @@ +"forfront_med_equip_cd","forfront_med_equip_name","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" +"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"12","X線CT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"13","CR","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"15","SPECT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"16","アンガー型カメラ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv new file mode 100644 index 00000000..0642d2d5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv @@ -0,0 +1,8 @@ +"forfront_med_equip_cd","forfront_med_equip_name","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" +"11","","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","com_forfront_med_equip_mapper" +"12","X線CT","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"13","CR","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"14","血管造影システム","20171023","20171023","20230421","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:14:25","com_forfront_med_equip_mapper" +"15","アンガー型カメラ","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"16","SPECT","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230421","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv new file mode 100644 index 00000000..4c37e0fd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv @@ -0,0 +1,8 @@ +"forfront_med_equip_cd","forfront_med_equip_name","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" +"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"12","X線CT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"13","CR","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"15","SPECT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"16","アンガー型カメラ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv new file mode 100644 index 00000000..3b8e7904 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv @@ -0,0 +1,9 @@ +"forfront_med_equip_cd","forfront_med_equip_name","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" +"11","","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 10:07:41","com_forfront_med_equip_mapper" +"12","X線CT","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"13","CR","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"15","アンガー型カメラ","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"16","SPECT","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py new file mode 100644 index 00000000..873d70c6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_forfront_med_equip_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComForfrontMedEquipMapper: + """ レイアウト区分022: COM_先端医療機器 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_先端医療機器テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_insert.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_先端医療機器テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_forfront_med_equip_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_forfront_med_equip', + 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_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_update.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_先端医療機器テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_forfront_med_equip_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_forfront_med_equip', + 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_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_delete.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv new file mode 100644 index 00000000..18531d8d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv @@ -0,0 +1,7 @@ +"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","重症肥満の外科治療法" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv new file mode 100644 index 00000000..31e575d3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv @@ -0,0 +1,6 @@ +"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","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv new file mode 100644 index 00000000..90620670 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv @@ -0,0 +1,6 @@ +"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診断" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv new file mode 100644 index 00000000..ac7de33a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","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" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv new file mode 100644 index 00000000..f6d16401 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","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" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"006","1","造血器腫瘍のDNA診断","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv new file mode 100644 index 00000000..e41f75a8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv @@ -0,0 +1,8 @@ +"hamtec_cd","hamtec_div","hamtec_name","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" +"001",,,"20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","com_hamtec_mapper" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","20171018","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"007","2","重症肥満の外科治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:21:01","com_hamtec_mapper","2017/10/18 17:21:01","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv new file mode 100644 index 00000000..35b58442 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","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" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"005","1","造血器腫瘍のDNA診断","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"006","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv new file mode 100644 index 00000000..fcdce90b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","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" +"001","","","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","com_hamtec_mapper" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py new file mode 100644 index 00000000..c7434739 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -0,0 +1,198 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_hamtec_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComHamtecMapper: + """レイアウト区分021: COM_高度先進医療""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_高度先進医療テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_insert.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + line_number = 0 + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_高度先進医療テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hamtec_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hamtec', + 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_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_update.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + line_number = 0 + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_高度先進医療テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hamtec_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hamtec', + 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_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_delete.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv new file mode 100644 index 00000000..fa9dfadd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv @@ -0,0 +1,7 @@ +"002","1","A","20141113","20141114","" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","C","20141113","20141114","歯科" +"002","6","A","20141113","20141114","伝染" +"002","7","A","20141113","20141114","診療所" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv new file mode 100644 index 00000000..e2ee7c48 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv @@ -0,0 +1,7 @@ +"002","1","A","20141113","20141114","一般" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","A","20141113","20141114","伝染" +"002","6","A","20141113","20141114","歯科" +"002","9","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv new file mode 100644 index 00000000..6d0fe490 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv @@ -0,0 +1,6 @@ +"002","1","A","20141113","20141114","" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","A","20141113","20141114","歯科" +"002","6","A","20141113","20141114","伝染" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv new file mode 100644 index 00000000..68440eee --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv @@ -0,0 +1,7 @@ +"hp_assrt_cd","hp_assrt_name","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" +"1","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"2","精神","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"3","結核","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"4","ハンセン","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"5","歯科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"6","伝染","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv new file mode 100644 index 00000000..79619900 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","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" +"1","一般","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"2","精神","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"3","結核","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"4","ハンセン","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"5","伝染","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"6","歯科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv new file mode 100644 index 00000000..54dc2039 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv @@ -0,0 +1,7 @@ +"hp_assrt_cd","hp_assrt_name","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" +"1","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"2","精神","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"3","結核","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"4","ハンセン","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"5","歯科","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"6","伝染","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv new file mode 100644 index 00000000..c4343da0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","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" +"1","一般","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"2","精神","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"3","結核","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"4","ハンセン","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"5","伝染","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"6","歯科","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv new file mode 100644 index 00000000..fe04619b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","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" +"1","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"2","精神","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"3","結核","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"4","ハンセン","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"5","歯科","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"6","伝染","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py new file mode 100644 index 00000000..08f02dec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_hp_assrt_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComHpAssrtMapper: + """レイアウト区分002: COM_病院種別""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_病院種別テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_insert.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_病院種別テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hp_assrt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hp_assrt', + 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_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_update.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_病院種別テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hp_assrt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hp_assrt', + 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_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_delete.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv new file mode 100644 index 00000000..5c588736 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv @@ -0,0 +1,5 @@ +"101","22","33333","44","C","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","00","9900146","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901649","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901679","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9904439","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv new file mode 100644 index 00000000..432c8f24 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv @@ -0,0 +1,8 @@ +"101","22","33333","44","A","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","00","9900146","","A","20141113","20141114","","","","","","医療法人敬老会森岡内科","イリヨウホウジンケイロウカイモリオカナイカ","森岡内科 医療","モリオカナイカ イリヨウ","","36","201","117","002","770-0854","徳島県徳島市徳島本町2-31","トクシマケン トクシマシ トクシマホンチヨウ 2-31","2-31","03","03","04","02","07","06","10","02","","088-623-6161","431","10","01","092029","","板東 章二","バンドウ シヨウジ","","","1","201410","A01","A11","C04","E02","A23","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20130729","0","0","0","0","0","0","0","","","","","","","","","","" +"101","00","9900194","","A","20141113","20141114","1","9","","","","一期崎医院","イチゴザキイイン","一期崎医院","イチゴザキイイン","6","43","101","059","000","860-0844","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","1-27-2D","03","06","3","","07","13","09","00","1","","472","10","","","","","","","","","","O01","O02","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20090430","0","0","0","0","0","0","0","","","","","","","","","","" +"101","00","9901649","","A","20141113","20141114","","","","","","社会福祉法人明和会特別養護老人ホームあづき","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","あづき(特養) 社福","アヅキ シヤフク","","37","322","000","000","761-4100","香川県小豆郡土庄町字半ノ池甲1360-143","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","","03","06","00","00","07","18","00","00","","0879-62-7707","435","41","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","9","9","","","","","50","","","","","","","","","","","","","","","","00","7201648","" +"101","00","9901679","","A","20141113","20141114","","","","","","鹿児島市医師会臨床検査センター","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","カゴシマシイシカイリンシヨウケンサセンタ-","","46","201","017","000","892-0846","鹿児島県鹿児島市加治屋町3-10","カゴシマケン カゴシマシ カジヤチヨウ 3-10","3-10","04","04","04","00","08","07","08","00","","099-226-8827","470","60","01","148013","","海江田 健","カイエダ タケル","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","9","9","","","","","0","","","","","","","","","1","1","1","1","1","1","1","","","" +"101","00","9904439","","A","20141113","20141114","","","","","","川崎市立井田病院","カワサキシリツイダビヨウイン","井田病院 市立","イダビヨウイン シリツ","","14","133","001","002","211-0035","神奈川県川崎市中原区井田2-27-1","カナガワケン カワサキシ ナカハラク イダ 2-27-1","2-27-1","04","06","02","02","08","12","04","02","","044-766-2188","221","01","","","","","","","","","","A01","A34","A22","M01","D02","A12","A81","C01","N03","K01","J01","P02","O01","B01","C04","E02","F01","I01","C05","B31","H02","A41","A03","A58","A61","A65","F08","A56","B11","B22","B04","P03","G06","A57","","","","","","","","","","","","","","","","","","","","","","","","","","","1","3","","","","","370","20140811","370","0","27","0","343","343","0","","","","","","","","","","" +"101","00","9929798","","A","20141113","20141114","","","","","","パーソナルヘルス学びのクリニック","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのCL","パ-ソナルヘルスマナビノクリニツク","","13","103","025","002","107-0062","東京都港区南青山2-2-15 ウイン青山405","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","2-2-15-405","03","02","03","02","07","05","08","02","1","","472","10","01","331831","","白澤 博満","シラサワ ヒロミツ","","","","","A01","I01","A57","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20130415","0","0","0","0","0","0","0","","","","","","","","","","" +"101","99","99999","99","A","20230606","200230607","@","@","@","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","@","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","@","@","36","37","@","39","40","@","@","@","202304","@","202306","@","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","@","10","11","@","@","@","@","6","7","8","9","0","1","@","3","4","5","6","7","8","@","333333","11" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv new file mode 100644 index 00000000..2a13c00e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv @@ -0,0 +1,10 @@ +"101","22","33333","44","B","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","22","33333","99","B","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","99","33333","44","B","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","99","99999","99","B","20230606","200230607","@","@","@","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","@","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","@","@","36","37","@","39","40","@","@","@","202304","@","202306","@","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","@","10","11","@","@","@","@","6","7","8","9","0","1","@","3","4","5","6","7","8","@","333333","11" +"101","00","9900146","","B","20170401","20170404","","2","00","3631462","","","テストイリヨウホウジンケイロウカイモリオカナイカ","","","","","","","","","","","","","","","","","","","","","","221","","","","","","","","","@","","@","A11","C04","E02","A23","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","@","","","@","@","@","@","","","","","","","","","","","","","","0","9912345","" +"101","00","9900194","","B","20170401","20170404","@","@","@","","","","","","","@","11","222","333","444","106-0045","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","1-5-18-10-3","3","2","4","2","7","5","13","2","","","","","","","","","","","","","","U21","U23","U18","U15","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901649","","B","20170401","20170404","","","","","","","","あづき(てすと)","","","","","","","","","","","","","","","","","","","","","","60","","","","","","1","201801","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","@","","" +"101","00","9901679","","B","20170401","20170404","","","","","","","","","カゴシマテスト","","","","","","","","","","","","","","","","","","","@","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","@","","","","","","","","","" +"101","00","9904439","","B","20170401","20170404","","","","","","川崎市立テスト病院","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","11","1234567","","","","","","","","","","","","3","","1","","2","","3","","","" +"101","00","9929798","","B","20170401","20170404","","","","","","","","","","6","","","","","","","","","","","","","","","","","@","","","","@","","","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","91","92","93","94","95","96","97","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv new file mode 100644 index 00000000..6e20eb7b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","0","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv new file mode 100644 index 00000000..0b1ad996 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"223333399","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"993333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"999999999","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"009900146","10","","イリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","1","0","1","","201410","","1","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","431","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130729","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","10","6","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","1","","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","860-0844","43101059000","43","101","1-27-2D","07130900","03060300","472","9","7","003631463","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009901649","41","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(特養) 社福","","50","","","","","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","9","","","","","","","","","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","","01148013","カイエダ タケル","海江田 健","","","099-226-8827","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","1","1","1","1","1","1","1","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立井田病院","井田病院 市立","","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","","","","","","","","3","343","0","27","0","370","343","0","20140811","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009929798","10","","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","01331831","シラサワ ヒロミツ","白澤 博満","1","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130415","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv new file mode 100644 index 00000000..cc988dcc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv @@ -0,0 +1,4 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","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" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"009900146","09912345","20220201","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 11:08:29","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","NULL","20220131","20220201","20220201","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv new file mode 100644 index 00000000..9bc1f8ff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv @@ -0,0 +1,5 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","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" +"223333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"009901649","007201648","20220131","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 11:38:27","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv new file mode 100644 index 00000000..557be371 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv @@ -0,0 +1,66 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900146","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv new file mode 100644 index 00000000..0873cb36 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv @@ -0,0 +1,48 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"009900146","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","A11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","A23","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","O02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv new file mode 100644 index 00000000..b2dde439 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","0","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","20230606","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv new file mode 100644 index 00000000..e79b6d77 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","10","","イリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","1","","201410","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","431","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130729","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009900194","10","6","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","1","","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","860-0844","43101059000","43","101","1-27-2D","07130900","03060300","472","9","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009901649","41","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(特養) 社福","","50","","","","","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","9","","","","","","","","","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","","01148013","カイエダ タケル","海江田 健","","","099-226-8827","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","1","1","1","1","1","1","1","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立井田病院","井田病院 市立","","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","","","","","","","","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","10","","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","01331831","シラサワ ヒロミツ","白澤 博満","1","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"999999999","37","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","NULL","7","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","8","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv new file mode 100644 index 00000000..3353e7ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","10",,"テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","NULL","NULL","NULL",,"NULL",,"NULL","01092029","バンドウ シヨウジ","板東 章二",,,"088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462",,,,,,,,"3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:28","com_inst_mapper" +"009900194","10","NULL","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院",,"0",,,,,,,,,"1","NULL",,"トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","NULL","7","NULL",,,,,,,,"6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901649","60",,"シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)",,"50",,"1",,"201801",,,,,,,"0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322",,"07180000","03060000","435",,"1",,,,,,,,,"9",,,,,,,,,"1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901679","60",,"カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター",,"0",,"NULL",,"NULL","1","01148013","カイエダ タケル","海江田 健",,,"NULL","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470",,"9",,"NULL","NULL","NULL","NULL","NULL","NULL","NULL","9",,,,,,,,,"1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009904439","01",,"カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370",,,,,,,,,,,"044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221",,"1",,"3",,"1",,"2",,"3","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL",,"0",,,,,,"NULL","NULL","NULL","NULL",,,"トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472",,"7",,,,,,,,,"6","95","92","93","94","91","96","97","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 11:08:30","com_inst_mapper" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"223333399","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"993333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"999999999","37","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","NULL","7","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","8","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv new file mode 100644 index 00000000..9cede581 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv @@ -0,0 +1,4 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","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" +"009900146","09912345","20220201","20220201","NULL","NULL","NULL","NULL","NULL","2022/02/01 11:08:29","clsComInstInfo","2022/02/01 14:52:43","clsComInstInfo" +"009901649","NULL","20220131","20220201","20220201","NULL","NULL","NULL","NULL","2022/01/31 11:38:27","clsComInstInfo","2022/02/01 14:52:43","clsComInstInfo" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv new file mode 100644 index 00000000..a07ed27d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv @@ -0,0 +1,3 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","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" +"009901649","007201648","20220131","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv new file mode 100644 index 00000000..4b14fe3d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv @@ -0,0 +1,7 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","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" +"009900146","09912345","20220201","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 11:08:29","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009901649","NULL","20220131","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 14:52:43","com_inst_mapper" +"223333344","9933333311","20230508","20230508","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333399","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","NULL","20230508","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv new file mode 100644 index 00000000..bfd476b6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv @@ -0,0 +1,66 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv new file mode 100644 index 00000000..78a3a2de --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv @@ -0,0 +1,105 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009900146","A11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","A23","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900194","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900194","O02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv new file mode 100644 index 00000000..9adf2bb7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv @@ -0,0 +1,103 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py new file mode 100644 index 00000000..a3554692 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -0,0 +1,425 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstMapper: + """レイアウト区分101: COM_施設""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + smallint_columns = [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_insert.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_insert.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_spcare_med_office_dat')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_施設テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # テストデータをDBに登録 + # DBデータを読み込む(施設) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(施設診療科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(特養医務室) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_spcare_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_spcare_med_office_dat', + 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_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_update.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_update.csv')) + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_施設テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(施設) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(施設診療科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(特養医務室) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_spcare_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_spcare_med_office_dat', + 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_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_delete.csv')) + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv new file mode 100644 index 00000000..baf15d84 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv @@ -0,0 +1,6 @@ +"111","123","456789","99","B","1","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900146","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900615","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9901806","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9901918","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9904136","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv new file mode 100644 index 00000000..7dd0af30 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv @@ -0,0 +1,21 @@ +"111","123","456789","99","A","0","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900146","","A","2","20141113","20141114","1","20080701","","","","","1","20100401","","","","","1","","20011022","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","","","20081130","1","20130501","","1","99","","","","","","","","","","","","","","","","","","","","1","20130501","","1","20140401","","1","20130501","","1","01","02","03","04","","","","","","","1","20130501","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","4","","","","","","","","","","","20040229","1","20031030","","1","20050914","","1","1","","1","","","","","","1","20090401","","","","1","217","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195604" +"111","00","9900194","","A","2","20141113","20141114","1","20060501","","","","","","","","","","","","","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204" +"111","00","9900615","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900631","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","","","","6","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900700","","A","2","20141113","20141114","1","20100701","","","","","1","20100401","","","","","1","","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","4","","","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310" +"111","00","9901649","","A","2","20141113","20141114","","","","1","2009","","","","","","","","","","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","","","","43","1","B999","120","","","","","","","","","","","","","","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004" +"111","00","9901806","","A","2","20141113","20141114","1","20090401","","","","","1","20100401","","","","","1","","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","8","","","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011" +"111","00","9901820","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","","","","4101","116","20090501","","116","1","B999","40","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405" +"111","00","9901918","","A","2","20141113","20141114","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","","","","84","1","B999","177","","","","","","","","","","","","","","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601" +"111","00","9902043","","A","2","20141113","20141114","1","20140401","","","","20140331","","","","","","","","","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004" +"111","00","9902175","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704" +"111","00","9902728","","A","2","20141113","20141114","1","20090401","","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","","","20040430","","","","20040430","","","","","","","","","","","","","","","","","","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005" +"111","00","9903500","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","","","","26","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912" +"111","00","9904136","","A","2","20141113","20141114","1","20080701","","","","","","","","","","","1","","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","1","1","10","","","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208" +"111","00","9904439","","A","2","20141113","20141114","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","","","20040930","54","1","B999","450","","","","","","","","","","","","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812" +"111","00","9906696","","A","2","20141113","20141114","1","20060601","","","","","","","","","","","1","","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708" +"111","00","9908576","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","","","","33","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704" +"111","00","9910624","","A","2","20141113","20141114","1","20030401","","","","","1","20120401","","1","19940201","","","","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202" +"111","00","9929798","","A","2","20141113","20141114","1","20080701","","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305" +"111","00","9929799",,"A","2","20141113","20141114","@","20080701","20080701","@","2008","20080701","@","20080701","20080701","@","20080701","20080701","@","10.1","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","20080701","20080701","@","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","15","17","18","19","20","@","20100401","20100401","@","20100401","20100401","@","20100401","20100401","@","01","02","03","04","05","06","07","08","09","10","@","20140401","20140401","@","20140401","20140401","@","20140401","20140401","@","20140401","20140401","@","@","@","I001","33","20130401","20130401","4101","116","20090501","20090501","33","@","B999","450","@","M999","40","@","K999","4","@","9","9","@","9","@","21","20130901","20130901","@","13","20140106","20140106","@","20030401","20040229","1","20041001","20041001","1","20040331","20040331","@","@","1","1","@","@","2","20070702","20070702","@","20070702","20070702","@","@","@","168","1","197","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182",,"202","1","214","5","149","1","197","1","198","1","177","1","183","1","213","5","217","5","212","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","@","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","@","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","@","00","8106522","00","@" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv new file mode 100644 index 00000000..ad999396 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv @@ -0,0 +1,5 @@ +"111","123","456789","99","A","0","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900631","","B","","20141113","20141114","1","20171009","","1","2017","20171009","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","@","","","","","","","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","" +"111","00","9901649","","B","","20141113","20141114","","","","1","2009","20171010","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710" +"111","00","9990146","","B","","20171113","20171114","@","","","@","","","@","","","@","","","@","","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","","","","","","","","","","","","","","","","","","","@","","","@","","","@","","","@","","","","","","","","","","","@","","","@","","","@","","","@","","","@","@","@","","","","","","","","","","@","","","@","","","@","","","@","","","@","","@","","","","@","","","","@","","","","","","","","","@","@","","","@","@","","","","@","","","@","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","@" +"111","99","9999999","99","B","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv new file mode 100644 index 00000000..ba1b07af --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv @@ -0,0 +1,23 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" +"009900146","1","20171009","20171009","2","2017","20171009","3","20171009","20171009","4","19940928","20171009","5","99.9","20171009","20171009","6","20120401","20171009","7","20171009","20171009","8","20171009","20171009","9","20121201","20171009","A","20090701","20171009","B","20061101","20171009","C","20171009","20171009","D","20171009","20171009","E","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","F","20100401","20171009","G","20140401","20171009","H","20140401","20171009","I","01","02","03","04","05","06","07","08","09","10","J","20140401","20171009","K","20171009","20171009","L","20171009","20171009","M","20171009","20171009","N","O","P","1234","9999","20171009","20171009","2234","8888","20171009","20171009","7777","Q","3234","6666","R","4234","5555","S","5234","4444","T","T","T","U","3333","V","2222","20171009","20171009","W","08","20100402","20171009","X","20171009","20060331","1","20041001","20171009","1","20040331","20171009","Y","Z","Z","Z","1","2","2","20070702","20171009","3","20171009","20171009","4","5","6","001","1","002","1","003","1","004","1","005","1","006","1","007","1","008","1","009","1","010","1","011","1","012","1","013","1","014","1","015","1","016","1","017","1","018","1","019","1","020","1","021","1","022","1","023","1","024","1","025","1","026","1","027","1","028","1","029","1","030","1","031","1","032","1","033","1","034","1","035","1","036","1","037","1","038","1","039","1","040","1","7","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","8","A1","1","A2","1","A3","1","A4","1","A5","1","A6","1","A7","1","A8","1","A9","1","B0","1","B1","1","B2","1","B3","1","B4","1","B5","1","B6","1","B7","1","B8","1","B9","1","C0","1","9","00","1234567","","192202","20171008","20171009","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/09 18:23:21","clsComInstAtt" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900615","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009901806","1","20090401","","","","","1","20100401","","","","","1","NULL","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","8","","NULL","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901918","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","NULL","","","84","1","B999","177","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904136","1","20080701","","","","","","","","","","","1","NULL","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","1","1","1","1","10","","NULL","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv new file mode 100644 index 00000000..b867c731 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"12345678999","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900631","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","NULL","","","6","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","1","20171009","20171009","2","2017","20171009","3","20171009","20171009","4","19940928","20171009","5","99.9","20171009","20171009","6","20120401","20171009","7","20171009","20171009","8","20171009","20171009","9","20121201","20171009","A","20090701","20171009","B","20061101","20171009","C","20171009","20171009","D","20171009","20171009","E","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","F","20100401","20171009","G","20140401","20171009","H","20140401","20171009","I","01","02","03","04","05","06","07","08","09","10","J","20140401","20171009","K","20171009","20171009","L","20171009","20171009","M","20171009","20171009","N","O","P","1234","9999","20171009","20171009","2234","8888","20171009","20171009","7777","Q","3234","6666","R","4234","5555","S","5234","4444","T","T","T","U","3333","V","2222","20171009","20171009","W","08","20100402","20171009","X","20171009","20060331","1","20041001","20171009","1","20040331","20171009","Y","Z","Z","Z","1","2","2","20070702","20171009","3","20171009","20171009","4","5","6","001","1","002","1","003","1","004","1","005","1","006","1","007","1","008","1","009","1","010","1","011","1","012","1","013","1","014","1","015","1","016","1","017","1","018","1","019","1","020","1","021","1","022","1","023","1","024","1","025","1","026","1","027","1","028","1","029","1","030","1","031","1","032","1","033","1","034","1","035","1","036","1","037","1","038","1","039","1","040","1","7","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","8","A1","1","A2","1","A3","1","A4","1","A5","1","A6","1","A7","1","A8","1","A9","1","B0","1","B1","1","B2","1","B3","1","B4","1","B5","1","B6","1","B7","1","B8","1","B9","1","C0","1","9","00","1234567","","192202","20171009","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/09 18:31:09","clsComInstAtt" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","aaaa","2023/05/09 10:10:10","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv new file mode 100644 index 00000000..9c17fa45 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv @@ -0,0 +1,17 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv new file mode 100644 index 00000000..fa54041d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv @@ -0,0 +1,21 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","1","20080701","","","","","1","20100401","","","","","1","NULL","20011022","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","","","20081130","1","20130501","","1","99","","","","","","","","","","","","","","","","","","","","1","20130501","","1","20140401","","1","20130501","","1","01","02","03","04","","","","","","","1","20130501","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","","","","20040229","1","20031030","","1","20050914","","1","1","","1","","","","","","1","20090401","","","","1","217","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195604","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900615","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900631","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","NULL","","","6","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901649","","","","1","2009","","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901806","1","20090401","","","","","1","20100401","","","","","1","NULL","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","8","","NULL","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901918","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","NULL","","","84","1","B999","177","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009904136","1","20080701","","","","","","","","","","","1","NULL","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","1","1","1","1","10","","NULL","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009929799","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv new file mode 100644 index 00000000..ecb59fbf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2023/05/09 10:10:10","com_inst_att_mapper" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","aaaa","2023/05/09 10:10:10","aaaa" + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py new file mode 100644 index 00000000..ac83cbcf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py @@ -0,0 +1,234 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_att_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstAttMapper: + """レイアウト区分111: COM_施設属性""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # smallint型のカラム群 + smallint_columns = [ + 'areasuphpintrate', + 'resthpbednum', + 'resthpcarebednum', + 'resthpsbednum', + 'nrmhpbedtotalnum', + 'menthpbednum', + 'tubhpbednum', + 'infhpbednum', + 'hospicebednum' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設属性テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_施設属性テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_att_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_att', + 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_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_physical_delete(self): + """ + Cases: + COM_施設属性テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_att_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_att', + 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_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_att')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv new file mode 100644 index 00000000..904e9593 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv @@ -0,0 +1,7 @@ +"011","01","A","20141113","20141114","" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","C","20141113","20141114","国立療養所" +"011","06","A","20141113","20141114","高次救急医療機関" +"011","07","A","20141113","20141114","社会福祉施設附属病院" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv new file mode 100644 index 00000000..7d7d994d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv @@ -0,0 +1,7 @@ +"011","01","A","20141113","20141114","病院(大学HP以外)" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","A","20141113","20141114","高次救急医療機関" +"011","06","A","","","国立療養所" +"011","99","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv new file mode 100644 index 00000000..b220b54f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv @@ -0,0 +1,6 @@ +"011","01","A","20141113","20141114","" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","A","20141113","20141114","国立療養所" +"011","06","A","20141113","20141114","高次救急医療機関" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv new file mode 100644 index 00000000..b5d0a632 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv @@ -0,0 +1,7 @@ +"inst_div_cd","inst_div_name","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" +"01","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"02","大学附属病院","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"03","大学附属病院分院","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"04","歯科病院(歯学部附属病院)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"05","国立療養所","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"06","高次救急医療機関","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv new file mode 100644 index 00000000..96935038 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","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" +"01","病院(大学HP以外)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"02","大学附属病院","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"03","大学附属病院分院","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"04","歯科病院(歯学部附属病院)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"05","高次救急医療機関","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"06","国立療養所","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"99","ああああ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv new file mode 100644 index 00000000..8928715b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","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" +"01","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"02","大学附属病院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"03","大学附属病院分院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:30:16","com_inst_div_mapper" +"05","国立療養所","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"06","高次救急医療機関","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"07","社会福祉施設附属病院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:30:16","com_inst_div_mapper","2023/05/15 17:30:16","com_inst_div_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv new file mode 100644 index 00000000..b482c0bf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","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" +"01","病院(大学HP以外)","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"02","大学附属病院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"03","大学附属病院分院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"05","高次救急医療機関","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"06","国立療養所","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv new file mode 100644 index 00000000..1f416568 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","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" +"01","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"02","大学附属病院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"03","大学附属病院分院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"05","国立療養所","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"06","高次救急医療機関","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"99","ああああ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py new file mode 100644 index 00000000..17091505 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_div_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstDivMapper: + """レイアウト区分011: COM_施設区分""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設区分テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_insert.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_施設区分テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_div_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_div', + 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_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_update.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_施設区分テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_div_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_div', + 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_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_delete.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_delete.csv new file mode 100644 index 00000000..51b1ac36 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_delete.csv @@ -0,0 +1,7 @@ +"007","101","A","20141113","20141114","" +"007","102","C","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","警察" +"007","105","A","20141113","20141114","総務" +"007","106","A","20141113","20141114","防衛" +"007","107","A","20141113","20141114","独法国" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_insert.csv new file mode 100644 index 00000000..8f21e4df --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_insert.csv @@ -0,0 +1,7 @@ +"007","101","A","20141113","20141114","厚生" +"007","102","A","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","総務" +"007","105","A","20141113","20141114","警察" +"007","106","A","20141113","20141114","防衛" +"007","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_update.csv new file mode 100644 index 00000000..a4bc1313 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_update.csv @@ -0,0 +1,6 @@ +"007","101","A","20141113","20141114","" +"007","102","A","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","警察" +"007","105","A","20141113","20141114","総務" +"007","106","A","20141113","20141114","防衛" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_delete.csv new file mode 100644 index 00000000..d992c162 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_delete.csv @@ -0,0 +1,7 @@ +"manage_cd","manage_name","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" +"101","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"102","文部","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"103","財務","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"104","警察","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"105","総務","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"106","防衛","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_update.csv new file mode 100644 index 00000000..1b73e668 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_update.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","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" +"101","厚生","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"102","文部","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"103","財務","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"104","総務","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"105","警察","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"106","防衛","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"999","あいうえおかきくけこ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_delete.csv new file mode 100644 index 00000000..05318030 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_delete.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","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" +"101","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"102","文部","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"103","財務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"104","警察","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"105","総務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"106","防衛","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"107","独法国","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:51:00","com_manage_mapper","2023/05/14 15:51:00","com_manage_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_insert.csv new file mode 100644 index 00000000..9041fe17 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_insert.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","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" +"101","厚生","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"102","文部","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"103","財務","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"104","総務","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"105","警察","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"106","防衛","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_update.csv new file mode 100644 index 00000000..4e2a7c7c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_update.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","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" +"101","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"102","文部","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"103","財務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"104","警察","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"105","総務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"106","防衛","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"999","あいうえおかきくけこ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/test_com_manage_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/test_com_manage_mapper.py new file mode 100644 index 00000000..b27092a9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/test_com_manage_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_manage_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComManageMapper: + """レイアウト区分007: COM_経営体""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_経営体テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_insert.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_経営体テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_manage_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_manage', + 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_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_update.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_経営体テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_manage_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_manage', + 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_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_delete.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv new file mode 100644 index 00000000..631fe4f9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv @@ -0,0 +1,3 @@ +"124","01","01","B","01","202","1","20141113","20141114","","" +"124","01","01","B","01","900","1","20141113","20141114","01","02" +"124","01","01","B","01","331","1","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv new file mode 100644 index 00000000..e8bf727d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv @@ -0,0 +1,3 @@ +"124","01","01","A","01","202","2","20141113","20141114","01","03" +"124","01","01","A","01","236","2","20141113","20141114","","" +"124","01","01","B","01","331","2","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv new file mode 100644 index 00000000..7ec208ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv @@ -0,0 +1,3 @@ +"124","01","01","A","01","202","2","20141113","20141114","","" +"124","01","01","A","01","236","2","20141113","20141114","01","02" +"124","01","01","B","01","331","2","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv new file mode 100644 index 00000000..756a99ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_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" +"01","01","01","202","","","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" +"01","01","01","236","01","02","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" +"01","01","01","331","01","01","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv new file mode 100644 index 00000000..dc0c8280 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_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" +"01","01","01","202","01","03","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" +"01","01","01","236","","","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" +"01","01","01","331","01","01","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv new file mode 100644 index 00000000..378928e3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv @@ -0,0 +1,2 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_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" +"01","01","01","236","01","02","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv new file mode 100644 index 00000000..35406b92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_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" +"01","01","01","202","01","03","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" +"01","01","01","236","","","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" +"01","01","01","331","01","01","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv new file mode 100644 index 00000000..e45e2614 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_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" +"01","01","01","202","","","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" +"01","01","01","236","01","02","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" +"01","01","01","331","01","01","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py new file mode 100644 index 00000000..0b208ab0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py @@ -0,0 +1,271 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_area_city_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedAreaCityMapper: + """レイアウト区分124: COM_医療圏都道府県市町村対応表""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏都道府県市町村対応表テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_insert.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_医療圏都道府県市町村対応表テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_area_city_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_area_city', + 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_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_update.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_医療圏都道府県市町村対応表テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_area_city_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_area_city', + 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_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_med_area_city')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv new file mode 100644 index 00000000..5543c107 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv @@ -0,0 +1,8 @@ +"024","01","A","20141113","20141114","" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","C","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院B" +"024","06","A","20141113","20141114","複合病院A" +"024","07","A","20141113","20141114","長期療養病院" +"024","99","C","20141113","20141114","精神病院B" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv new file mode 100644 index 00000000..904b15f6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv @@ -0,0 +1,7 @@ +"024","01","A","20141113","20141114","一般病院A" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","A","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院A" +"024","06","A","20141113","20141114","複合病院B" +"024","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv new file mode 100644 index 00000000..6a92676f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv @@ -0,0 +1,6 @@ +"024","01","A","20141113","20141114","" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","A","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院B" +"024","06","A","20141113","20141114","複合病院A" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv new file mode 100644 index 00000000..28ec2538 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","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" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"03","精神病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"04","精神病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"05","複合病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"06","複合病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv new file mode 100644 index 00000000..0dec3123 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","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" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"03","精神病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"04","精神病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"05","複合病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"06","複合病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv new file mode 100644 index 00000000..ec7302e3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv @@ -0,0 +1,8 @@ +"med_func_valuation_cd","med_func_valuation_name","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" +"01","","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","com_med_func_valuation_mapper" +"02","一般病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"03","精神病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"04","精神病院B","20171024","20171024","20230424","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2023/04/23 10:22:50","com_med_func_valuation_mapper" +"05","複合病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"06","複合病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"07","長期療養病院","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:22:50","com_med_func_valuation_mapper","2017/10/24 10:22:50","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv new file mode 100644 index 00000000..ca00954e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv @@ -0,0 +1,8 @@ +"med_func_valuation_cd","med_func_valuation_name","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" +"01","一般病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"02","一般病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"03","精神病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"04","精神病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"05","複合病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"06","複合病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv new file mode 100644 index 00000000..b5292152 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","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" +"01","","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","com_med_func_valuation_mapper" +"02","一般病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"03","精神病院A","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"04","精神病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"05","複合病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"06","複合病院A","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py new file mode 100644 index 00000000..b21789a6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_func_valuation_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedFuncValuationMapper: + """レイアウト区分024: COM_医療機器評価 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療機器評価テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_insert.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_医療機器評価テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_func_valuation_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_func_valuation', + 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_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_update.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_医療機器評価テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_func_valuation_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_func_valuation', + 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_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_delete.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv new file mode 100644 index 00000000..2416d338 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv @@ -0,0 +1,3 @@ +"121","01","C","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","09","C","20141118","20141122","","","","","","","","","","","","","","" +"121","03","C","20141118","20141122","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv new file mode 100644 index 00000000..0f161d10 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv @@ -0,0 +1,4 @@ +"121","01","A","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","02","A","20141118","20141122","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12" +"121","03","A","20141118","20141122","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0" +"121","99","A","","","20140101","20130329","123456","123456","20120930","1234567","123456","123456","20120930","1234567","123456","123465","20120930","1234567" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv new file mode 100644 index 00000000..0c5f5b39 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv @@ -0,0 +1,3 @@ +"121","01","A","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","02","A","20141118","20141122","","","","","","","","","","","","","","" +"121","03","B","20141118","20141122","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv new file mode 100644 index 00000000..892066e1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" +"03","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv new file mode 100644 index 00000000..d5ea9119 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" +"02","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" +"03","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv new file mode 100644 index 00000000..891196ec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv @@ -0,0 +1,2 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv new file mode 100644 index 00000000..a6b694f7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv @@ -0,0 +1,5 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"02","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"03","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"99","20140101","20130329","123456","123456","20120930","1234567","123456","123456","20120930","1234567","123456","123465","20120930","1234567","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv new file mode 100644 index 00000000..7d595e49 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" +"03","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py new file mode 100644 index 00000000..02424dbd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py @@ -0,0 +1,222 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_prefc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedPrefcMapper: + """レイアウト区分121: COM_医療圏都道府県""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # decimal型のカラム群 + decimal_columns = [ + 'psy_bednumtg', + 'psy_bednumgen', + 'tb_bednumtg', + 'tb_bednumgen', + 'inf_bednumtg', + 'inf_bednumgen' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏都道府県テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_insert.csv')) + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_医療圏都道府県テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_prefc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_prefc', + 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_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_update.csv')) + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_physical_delete(self): + """ + Cases: + COM_医療圏都道府県テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_prefc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_prefc', + 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_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_med_prefc')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv new file mode 100644 index 00000000..a89aed2c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv @@ -0,0 +1,8 @@ +"023","3991","A","20141113","20141114","" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","C","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","4105","A","20141113","20141114","療養型介護療養施設サービス費" +"023","9999","C","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv new file mode 100644 index 00000000..b12393f2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv @@ -0,0 +1,7 @@ +"023","3991","A","20141113","20141114","診療所療養型種別不明" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","A","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","9999","A","20141113","20141114","ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおか" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv new file mode 100644 index 00000000..2eac2208 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv @@ -0,0 +1,6 @@ +"023","3991","A","20141113","20141114","" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","A","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv new file mode 100644 index 00000000..de1019b7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","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" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv new file mode 100644 index 00000000..de1019b7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","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" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv new file mode 100644 index 00000000..97e10546 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv @@ -0,0 +1,8 @@ +"nurse_assrt_cd","nurse_assrt_name","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" +"3991","","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","com_nurse_assrt_mapper" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","20230421","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4105","療養型介護療養施設サービス費","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:31:18","com_nurse_assrt_mapper","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv new file mode 100644 index 00000000..564adfff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv @@ -0,0 +1,8 @@ +"nurse_assrt_cd","nurse_assrt_name","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" +"3991","診療所療養型種別不明","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4101","療養型介護療養施設サービス費(Ⅰ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費(Ⅳ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費種別不明","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"9999","ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおか","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv new file mode 100644 index 00000000..82c4ee0a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","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" +"3991","","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","com_nurse_assrt_mapper" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py new file mode 100644 index 00000000..49bf7c8f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py @@ -0,0 +1,198 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_nurse_assrt_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComNurseAssrtMapper: + """レイアウト区分023: COM_看護種別""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_insert.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_出身校テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_nurse_assrt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_nurse_assrt', + 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_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_update.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_出身校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_nurse_assrt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_nurse_assrt', + 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_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_delete.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv new file mode 100644 index 00000000..fddb0e94 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv @@ -0,0 +1,3 @@ +"102","03","3673010",,"C","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","9","9","9","C","200501","200601","7","0","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" +"102","99","1234567",,"C","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv new file mode 100644 index 00000000..0f6a5751 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv @@ -0,0 +1,120 @@ +"102","12","345678","3","A","200501","200601","7","8","123","456","78901","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオ","6","17","189","19","2099","221-0001","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","1.23457E+12","25","26","27","28","29","30","31","32","3","0120-1234-12345","353","22","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","9","204001","1","204201","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","12","3456","78901" +"102","03","3673000",,"A","20121127","20121128",,,,,,"正式店舗名03","セイシキテンポメイ03","略式03","リヤクシキ03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","2-45-1-03","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673001",,"A","20121128","20121129",,,,,,"正式店舗名03A01a","セイシキテンポメイ03A01A","略式03A01a","リヤクシキ03A01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","2-45-1-03A01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673002",,"A","20121127","20121128",,,,,,"正式店舗名03A01b-01","セイシキテンポメイ03A01B-01","略式03A01b-01","リヤクシキ03A01B-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673003",,"A","20121128","20121129",,,,,,"正式店舗名03A01b-02","セイシキテンポメイ03A01B-02","略式03A01b-02","リヤクシキ03A01B-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673004",,"A","20121128","20121129",,,,,,"正式店舗名03A01c","セイシキテンポメイ03A01C","略式03A01c","リヤクシキ03A01C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","2-45-1-03A01C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","03","3673005",,"A","20121128","20121129","1",,,,,"正式店舗名03A01d","セイシキテンポメイ03A01D","略式03A01d","リヤクシキ03A01D",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","2-45-1-03A01D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673010",,"A","20121127","20121128",,"1",,,,"正式店舗名03A02a","セイシキテンポメイ03A02A","略式03A02a","リヤクシキ03A02A","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","2-45-1-03A02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673011",,"A","20121127","20121128","1",,,,,"正式店舗名03B01a","セイシキテンポメイ03B01A","略式03B01a","リヤクシキ03B01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","2-45-1-03B01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673012",,"A","20121127","20121128",,,,,,"正式店舗名03B02a","セイシキテンポメイ03B02A","略式03B02a","リヤクシキ03B02A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","2-45-1-03B02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673013",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02b","セイシキテンポメイ03B02B","略式03B02b","リヤクシキ03B02B","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","2-45-1-03B02B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673014",,"A","20121127","20121128",,,,,,"正式店舗名03B02c-01","セイシキテンポメイ03B02C-01","略式03B02c-01","リヤクシキ03B02C-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673015",,"A","20121128","20121129",,,,,,"正式店舗名03B02c-02","セイシキテンポメイ03B02C-02","略式03B02c-02","リヤクシキ03B02C-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673016",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-01","セイシキテンポメイ03B02D-01","略式03B02d-01","リヤクシキ03B02D-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673020",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-02","セイシキテンポメイ03B02D-02","略式03B02d-02","リヤクシキ03B02D-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673021",,"A","20121128","20121129",,,,,,"正式店舗名03B02d-03","セイシキテンポメイ03B02D-03","略式03B02d-03","リヤクシキ03B02D-03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673022",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02e","セイシキテンポメイ03B02E","略式03B02e","リヤクシキ03B02E","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02e","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","2-45-1-03B02E","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673023",,"A","20121127","20121128",,,,,,"正式店舗名03B03a全件","セイシキテンポメイ03B03Aゼンケン","略式03B03a全件","リヤクシキ03B03Aゼンケン",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","2-45-1-03B03A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673024",,"A","20121127","20121128",,,,,,"正式店舗名03B03b","セイシキテンポメイ03B03B","略式03B03b","リヤクシキ03B03B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","2-45-1-03B03B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673025",,"A","20121127","20121128",,,,,,"正式店舗名03B04a","セイシキテンポメイ03B04A","略式03B04a","リヤクシキ03B04A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","2-45-1-03B04A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673026",,"A","20121127","20121128",,,,,,"正式店舗名03B04b","セイシキテンポメイ03B04B","略式03B04b","リヤクシキ03B04B","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","2-45-1-03B04B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673030",,"A","20121127","20121128",,,,,,"正式店舗名03B04c","セイシキテンポメイ03B04C","略式03B04c","リヤクシキ03B04C","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","2-45-1-03B04C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673031",,"A","20121127","20121128",,,,,,"正式店舗名03B05a","セイシキテンポメイ03B05A","略式03B05a","リヤクシキ03B05A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","2-45-1-03B05A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673032",,"A","20121127","20121128",,,,,,"正式店舗名03B05b","セイシキテンポメイ03B05B","略式03B05b","リヤクシキ03B05B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","2-45-1-03B05B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673033",,"A","20121127","20121128",,,,,,"正式店舗名03B06a","セイシキテンポメイ03B06A","略式03B06a","リヤクシキ03B06A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","2-45-1-03B06A","3","3","5","2","7","7","12","2","1",,"471","85",,,,,,,,,,, +"102","03","3673034",,"A","20121127","20121128",,,,,,"正式店舗名03B06b","セイシキテンポメイ03B06B","略式03B06b","リヤクシキ03B06B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","2-45-1-03B06B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673035",,"A","20121127","20121128",,,,,,"正式店舗名03B06c","セイシキテンポメイ03B06C","略式03B06c","リヤクシキ03B06C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","2-45-1-03B06C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673036",,"A","20121127","20121128",,,,,,"正式店舗名03B07a","セイシキテンポメイ03B07A","略式03B07a","リヤクシキ03B07A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B07a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","2-45-1-03B07A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673040",,"A","20121127","20121128",,,,,,"正式店舗名03B08a","セイシキテンポメイ03B08A","略式03B08a","リヤクシキ03B08A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B08a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","2-45-1-03B08A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673041",,"A","20121127","20121128",,,,,,"正式店舗名03B09a","セイシキテンポメイ03B09A","略式03B09a","リヤクシキ03B09A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","2-45-1-03B09A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673042",,"A","20121127","20121128",,,,,,"正式店舗名03B09b","セイシキテンポメイ03B09B","略式03B09b","リヤクシキ03B09B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","2-45-1-03B09B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09b","ダイヒヨウシヤメイ 03B09B",,,,,,,,, +"102","03","3673043",,"A","20121127","20121128",,,,,,"正式店舗名03B09c","セイシキテンポメイ03B09C","略式03B09c","リヤクシキ03B09C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","2-45-1-03B09C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09c","ダイヒヨウシヤメイ 03B09C",,,,,,,,, +"102","03","3673044",,"A","20121127","20121128",,,,,,"正式店舗名03B10a","セイシキテンポメイ03B10A","略式03B10a","リヤクシキ03B10A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","2-45-1-03B10A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","03","3673045",,"A","20121127","20121128",,,,,,"正式店舗名03B10b","セイシキテンポメイ03B10B","略式03B10b","リヤクシキ03B10B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","2-45-1-03B10B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201210",,,,,,, +"102","03","3673046",,"A","20121127","20121128",,,,,,"正式店舗名03B11a","セイシキテンポメイ03B11A","略式03B11a","リヤクシキ03B11A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","2-45-1-03B11A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673047",,"A","20121127","20121128",,,,,,"正式店舗名03B11b","セイシキテンポメイ03B11B","略式03B11b","リヤクシキ03B11B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","2-45-1-03B11B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","03","3673048",,"A","20121127","20121128",,,,,,"正式店舗名03B11c","セイシキテンポメイ03B11C","略式03B11c","リヤクシキ03B11C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","2-45-1-03B11C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","03","3673051",,"A","20121127","20121128",,,,,,"正式店舗名03B12a","セイシキテンポメイ03B12A","略式03B12a","リヤクシキ03B12A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","2-45-1-03B12A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673052",,"A","20121127","20121128",,,,,,"正式店舗名03B12b","セイシキテンポメイ03B12B","略式03B12b","リヤクシキ03B12B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","2-45-1-03B12B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,, +"102","03","3673053",,"A","20121127","20121128",,,,,,"正式店舗名03B12c","セイシキテンポメイ03B12C","略式03B12c","リヤクシキ03B12C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","2-45-1-03B12C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,, +"102","03","3673054",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673055",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673056",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673060",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673061",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673056", +"102","03","3673062",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673063",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673062", +"102","03","3673801",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ1","□","リヤクシキモジ1",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ1","2-45-1-1","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ1 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ1 タロウ",,, +"102","03","3673802",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ2","□","リヤクシキモジ2",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ2","2-45-1-2","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ2 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ2 タロウ",,, +"102","03","3673803",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ3","□","リヤクシキモジ3",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ3","2-45-1-3","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ3 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ3 タロウ",,, +"102","03","3673804",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ4","","リヤクシキモジ4",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ4","2-45-1-4","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ4 タロウ",,,,," 太郎","カンリヤクザイシメイモジ4 タロウ",,, +"102","03","3673805",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ5","","リヤクシキモジ5",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ5","2-45-1-5","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ5 タロウ",,,,," 太郎","カンリヤクザイシメイモジ5 タロウ",,, +"102","03","3673806",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ6","","リヤクシキモジ6",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ6","2-45-1-6","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ6 タロウ",,,,," 太郎","カンリヤクザイシメイモジ6 タロウ",,, +"102","03","3673807",,"A","20121127","20121128",,,,,,"□□□□□","セイシキテンポメイモジ7","□□□□□","リヤクシキモジ7",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ7","2-45-1-7","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□ 太郎","ダイヒヨウシヤメイモジ7 タロウ",,,,,"□□□□□ 太郎","カンリヤクザイシメイモジ7 タロウ",,, +"102","03","3673808",,"A","20121127","20121128",,,,,,"□□□□□","セイシキテンポメイモジ8","□□□□□","リヤクシキモジ8",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ8","2-45-1-8","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□ 太郎","ダイヒヨウシヤメイモジ8 タロウ",,,,,"□□□□□ 太郎","カンリヤクザイシメイモジ8 タロウ",,, +"102","03","3673809",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ9","□□□□□□□□","リヤクシキモジ9",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ9","2-45-1-9","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ9 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ9 タロウ",,, +"102","03","3673810",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ10","□□□□□□□□","リヤクシキモジ10",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ10","2-45-1-10","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ10 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ10 タロウ",,, +"102","03","3673811",,"A","20121127","20121128",,,,,,"□□□□□□","セイシキテンポメイモジ11","□□□□□□","リヤクシキモジ11",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ11","2-45-1-11","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□ 太郎","ダイヒヨウシヤメイモジ11 タロウ",,,,,"□□□□□□ 太郎","カンリヤクザイシメイモジ11 タロウ",,, +"102","03","3673812",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ12","□□□□□□□","リヤクシキモジ12",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ12","2-45-1-12","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ12 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ12 タロウ",,, +"102","03","3673813",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ13","□□□□□□□□","リヤクシキモジ13",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ13","2-45-1-13","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ13 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ13 タロウ",,, +"102","03","3673814",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ14","□□□□□□□□","リヤクシキモジ14",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ14","2-45-1-14","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ14 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ14 タロウ",,, +"102","03","3673815",,"A","20121127","20121128",,,,,,"□□□□","セイシキテンポメイモジ15","□□□□","リヤクシキモジ15",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ15","2-45-1-15","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□ 太郎","ダイヒヨウシヤメイモジ15 タロウ",,,,,"□□□□ 太郎","カンリヤクザイシメイモジ15 タロウ",,, +"102","03","3673816",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ16","□□□□□□□","リヤクシキモジ16",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ16","2-45-1-16","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ16 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ16 タロウ",,, +"102","03","3673817",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ17","□□□□□□□","リヤクシキモジ17",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ17","2-45-1-17","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ17 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ17 タロウ",,, +"102","03","3673818",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ18","□□□□□□□","リヤクシキモジ18",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ18","2-45-1-18","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ18 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ18 タロウ",,, +"102","03","3673819",,"A","20121127","20121128",,,,,,"□□□□□□□□□□","セイシキテンポメイモジ19","□□□□□□□□□□","リヤクシキモジ19",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ19","2-45-1-19","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ19 タロウ",,,,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ19 タロウ",,, +"102","03","3673820",,"A","20121127","20121128",,,,,,"□□□□□□□□□□","セイシキテンポメイモジ20","□□□□□□□□□□","リヤクシキモジ20",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ20","2-45-1-20","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ20 タロウ",,,,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ20 タロウ",,, +"102","03","3673821",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ21","□□□□□□□□","リヤクシキモジ21",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ21","2-45-1-21","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ21 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ21 タロウ",,, +"102","03","3673822",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ22","","リヤクシキモジ22",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ22","2-45-1-22","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ22 タロウ",,,,," 太郎","カンリヤクザイシメイモジ22 タロウ",,, +"102","03","3673823",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ23","","リヤクシキモジ23",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ23","2-45-1-23","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ23 タロウ",,,,," 太郎","カンリヤクザイシメイモジ23 タロウ",,, +"102","03","3673824",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ24","","リヤクシキモジ24",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ24","2-45-1-24","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ24 タロウ",,,,," 太郎","カンリヤクザイシメイモジ24 タロウ",,, +"102","03","3673825",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ25","","リヤクシキモジ25",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ25","2-45-1-25","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ25 タロウ",,,,," 太郎","カンリヤクザイシメイモジ25 タロウ",,, +"102","03","3673826",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ26","□","リヤクシキモジ26",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ26","2-45-1-26","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ26 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ26 タロウ",,, +"102","03","3673827",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ27","","リヤクシキモジ27",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ27","2-45-1-27","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ27 タロウ",,,,," 太郎","カンリヤクザイシメイモジ27 タロウ",,, +"102","03","3673828",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ28","","リヤクシキモジ28",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ28","2-45-1-28","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ28 タロウ",,,,," 太郎","カンリヤクザイシメイモジ28 タロウ",,, +"102","03","3673829",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ29","","リヤクシキモジ29",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ29","2-45-1-29","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ29 タロウ",,,,," 太郎","カンリヤクザイシメイモジ29 タロウ",,, +"102","03","3673830",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ30","□","リヤクシキモジ30",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ30","2-45-1-30","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ30 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ30 タロウ",,, +"102","03","3673831",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ31","","リヤクシキモジ31",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ31","2-45-1-31","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ31 タロウ",,,,," 太郎","カンリヤクザイシメイモジ31 タロウ",,, +"102","03","3673832",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ32","","リヤクシキモジ32",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ32","2-45-1-32","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ32 タロウ",,,,," 太郎","カンリヤクザイシメイモジ32 タロウ",,, +"102","03","3673833",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ33","","リヤクシキモジ33",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ33","2-45-1-33","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ33 タロウ",,,,," 太郎","カンリヤクザイシメイモジ33 タロウ",,, +"102","03","3673834",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ34","□□","リヤクシキモジ34",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ34","2-45-1-34","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ34 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ34 タロウ",,, +"102","03","3673835",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ35","","リヤクシキモジ35",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ35","2-45-1-35","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ35 タロウ",,,,," 太郎","カンリヤクザイシメイモジ35 タロウ",,, +"102","03","3673836",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ36","","リヤクシキモジ36",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ36","2-45-1-36","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ36 タロウ",,,,," 太郎","カンリヤクザイシメイモジ36 タロウ",,, +"102","03","3673837",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ37","","リヤクシキモジ37",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ37","2-45-1-37","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ37 タロウ",,,,," 太郎","カンリヤクザイシメイモジ37 タロウ",,, +"102","03","3673838",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ38","□","リヤクシキモジ38",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ38","2-45-1-38","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ38 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ38 タロウ",,, +"102","03","3673839",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ39","","リヤクシキモジ39",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ39","2-45-1-39","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ39 タロウ",,,,," 太郎","カンリヤクザイシメイモジ39 タロウ",,, +"102","03","3673840",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ40","","リヤクシキモジ40",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ40","2-45-1-40","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ40 タロウ",,,,," 太郎","カンリヤクザイシメイモジ40 タロウ",,, +"102","03","3673841",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ41","","リヤクシキモジ41",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ41","2-45-1-41","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ41 タロウ",,,,," 太郎","カンリヤクザイシメイモジ41 タロウ",,, +"102","03","3673842",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ42","","リヤクシキモジ42",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ42","2-45-1-42","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ42 タロウ",,,,," 太郎","カンリヤクザイシメイモジ42 タロウ",,, +"102","03","3673843",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ43","","リヤクシキモジ43",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ43","2-45-1-43","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ43 タロウ",,,,," 太郎","カンリヤクザイシメイモジ43 タロウ",,, +"102","03","3673844",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ44","","リヤクシキモジ44",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ44","2-45-1-44","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ44 タロウ",,,,," 太郎","カンリヤクザイシメイモジ44 タロウ",,, +"102","03","3673845",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ45","","リヤクシキモジ45",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ45","2-45-1-45","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ45 タロウ",,,,," 太郎","カンリヤクザイシメイモジ45 タロウ",,, +"102","03","3673846",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ46","","リヤクシキモジ46",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ46","2-45-1-46","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ46 タロウ",,,,," 太郎","カンリヤクザイシメイモジ46 タロウ",,, +"102","03","3673847",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ47","□","リヤクシキモジ47",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ47","2-45-1-47","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ47 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ47 タロウ",,, +"102","03","3673848",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ48","□","リヤクシキモジ48",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ48","2-45-1-48","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ48 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ48 タロウ",,, +"102","03","3673849",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ49","","リヤクシキモジ49",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ49","2-45-1-49","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ49 タロウ",,,,," 太郎","カンリヤクザイシメイモジ49 タロウ",,, +"102","03","3673850",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ50","□","リヤクシキモジ50",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ50","2-45-1-50","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ50 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ50 タロウ",,, +"102","03","3673851",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ51","","リヤクシキモジ51",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ51","2-45-1-51","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ51 タロウ",,,,," 太郎","カンリヤクザイシメイモジ51 タロウ",,, +"102","03","3673852",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ52","□","リヤクシキモジ52",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ52","2-45-1-52","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ52 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ52 タロウ",,, +"102","03","3673853",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ53","","リヤクシキモジ53",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ53","2-45-1-53","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ53 タロウ",,,,," 太郎","カンリヤクザイシメイモジ53 タロウ",,, +"102","03","3673854",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ54","","リヤクシキモジ54",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ54","2-45-1-54","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ54 タロウ",,,,," 太郎","カンリヤクザイシメイモジ54 タロウ",,, +"102","03","3673855",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ55","","リヤクシキモジ55",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ55","2-45-1-55","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ55 タロウ",,,,," 太郎","カンリヤクザイシメイモジ55 タロウ",,, +"102","03","3673856",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ56","","リヤクシキモジ56",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ56","2-45-1-56","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ56 タロウ",,,,," 太郎","カンリヤクザイシメイモジ56 タロウ",,, +"102","03","3673857",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ57","","リヤクシキモジ57",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ57","2-45-1-57","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ57 タロウ",,,,," 太郎","カンリヤクザイシメイモジ57 タロウ",,, +"102","03","3673858",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ58","","リヤクシキモジ58",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ58","2-45-1-58","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ58 タロウ",,,,," 太郎","カンリヤクザイシメイモジ58 タロウ",,, +"102","03","3673859",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ59","","リヤクシキモジ59",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ59","2-45-1-59","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ59 タロウ",,,,," 太郎","カンリヤクザイシメイモジ59 タロウ",,, +"102","03","3673860",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ60","","リヤクシキモジ60",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ60","2-45-1-60","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ60 タロウ",,,,," 太郎","カンリヤクザイシメイモジ60 タロウ",,, +"102","03","3673861",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ61","","リヤクシキモジ61",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ61","2-45-1-61","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ61 タロウ",,,,," 太郎","カンリヤクザイシメイモジ61 タロウ",,, +"102","03","3673862",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ62","","リヤクシキモジ62",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ62","2-45-1-62","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ62 タロウ",,,,," 太郎","カンリヤクザイシメイモジ62 タロウ",,, +"102","03","3673863",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ63","","リヤクシキモジ63",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ63","2-45-1-63","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ63 タロウ",,,,," 太郎","カンリヤクザイシメイモジ63 タロウ",,, +"102","03","3673864",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ64","□□","リヤクシキモジ64",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ64","2-45-1-64","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ64 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ64 タロウ",,, +"102","03","3673865",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ65","□□","リヤクシキモジ65",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ65","2-45-1-65","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ65 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ65 タロウ",,, +"102","03","3673866",,"A","20121127","20121128",,,,,,"鯵鰺鴬鶯蛎蠣撹攪竃竈","セイシキテンポメイモジ66","鯵鰺鴬鶯蛎蠣撹攪竃竈","リヤクシキモジ66",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 鯵鰺鴬鶯蛎蠣撹攪竃竈","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ66","2-45-1-66","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","ダイヒヨウシヤメイモジ66 タロウ",,,,,"鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","カンリヤクザイシメイモジ66 タロウ",,, +"102","03","3673867",,"A","20121127","20121128",,,,,,"潅灌諌諫頚頸砿礦蕊蘂","セイシキテンポメイモジ67","潅灌諌諫頚頸砿礦蕊蘂","リヤクシキモジ67",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 潅灌諌諫頚頸砿礦蕊蘂","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ67","2-45-1-67","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","潅灌諌諫頚頸砿礦蕊蘂 太郎","ダイヒヨウシヤメイモジ67 タロウ",,,,,"潅灌諌諫頚頸砿礦蕊蘂 太郎","カンリヤクザイシメイモジ67 タロウ",,, +"102","03","3673868",,"A","20121127","20121128",,,,,,"靭靱賎賤壷壺砺礪梼檮","セイシキテンポメイモジ68","靭靱賎賤壷壺砺礪梼檮","リヤクシキモジ68",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 靭靱賎賤壷壺砺礪梼檮","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ68","2-45-1-68","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","靭靱賎賤壷壺砺礪梼檮 太郎","ダイヒヨウシヤメイモジ68 タロウ",,,,,"靭靱賎賤壷壺砺礪梼檮 太郎","カンリヤクザイシメイモジ68 タロウ",,, +"102","03","3673869",,"A","20121127","20121128",,,,,,"涛濤迩邇蝿蠅桧檜侭儘","セイシキテンポメイモジ69","涛濤迩邇蝿蠅桧檜侭儘","リヤクシキモジ69",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 涛濤迩邇蝿蠅桧檜侭儘","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ69","2-45-1-69","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","涛濤迩邇蝿蠅桧檜侭儘 太郎","ダイヒヨウシヤメイモジ69 タロウ",,,,,"涛濤迩邇蝿蠅桧檜侭儘 太郎","カンリヤクザイシメイモジ69 タロウ",,, +"102","03","3673870",,"A","20121127","20121128",,,,,,"薮藪篭籠","セイシキテンポメイモジ70","薮藪篭籠","リヤクシキモジ70",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 薮藪篭籠","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ70","2-45-1-70","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","薮藪篭籠 太郎","ダイヒヨウシヤメイモジ70 タロウ",,,,,"薮藪篭籠 太郎","カンリヤクザイシメイモジ70 タロウ",,, +"102","03","3673871",,"A","20121127","20121128",,,,,,"尭堯槙槇遥遙瑶瑤凜熙","セイシキテンポメイモジ71","尭堯槙槇遥遙瑶瑤凜熙","リヤクシキモジ71",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 尭堯槙槇遥遙瑶瑤凜熙","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ71","2-45-1-71","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","尭堯槙槇遥遙瑶瑤凜熙 太郎","ダイヒヨウシヤメイモジ71 タロウ",,,,,"尭堯槙槇遥遙瑶瑤凜熙 太郎","カンリヤクザイシメイモジ71 タロウ",,, +"102","03","3673872",,"A","20121127","20121128",,,,,,"ツッー-一医院薬鈴田","セイシキテンポメイモジ72","ツッー-一医院薬鈴田","リヤクシキモジ72",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ツッー-一医院薬鈴田","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ72","2-45-1-72","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","ツッー-一医院薬鈴田 太郎","ダイヒヨウシヤメイモジ72 タロウ",,,,,"ツッー-一医院薬鈴田 太郎","カンリヤクザイシメイモジ72 タロウ",,, +"102","03","3673873",,"A","20121127","20121128","@","@","@","3673873","00","正漢字","セイカナ","略漢字","リヤクカナ","@","61","62","63","64","001-6234","住所漢字","ジユウシヨカナ","@","1","2","3","4","5","6","7","8","@","@","471","66","@","@","@","201212","@","201210","@","@","@","3673056","00" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv new file mode 100644 index 00000000..8d55aa75 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv @@ -0,0 +1,37 @@ +"102","1","2","3","B",,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","9","9","9","B",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","4","5","6","B",200501,200601,"6",7,55,56,57,正漢字,正カナ,略漢字,略カナ,0,61,62,63,64,001-6234,住所漢字,住所カナ,11,1,2,3,4,5,6,7,8,0,119991234,11,66,代漢,代カナ,4,204411,8,204812,薬剤師漢字,薬剤師カナ,99,88,77, +"102","7","8","9","B",200501,200601,"6",@,@,,,正漢字,正カナ,略漢字,略カナ,@,61,62,63,64,001-6234,住所漢字,住所カナ,@,1,2,3,4,5,6,7,8,@,@,471,66,@,@,@,,@,,@,@,@,,, +"102","03","3673002",,"B",20121128,20121129,,5,03,3673003,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673011",,"B",20121128,20121129,"@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673012",,"B",20121128,20121129,,1,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673013",,"B",20121128,20121129,,2,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673014",,"B",20121128,20121129,,5,03,3673015,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673016",,"B",20121128,20121129,,7,03,3673021,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673020",,"B",20121128,20121129,,7,03,3673021,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673022",,"B",20121128,20121129,,@,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673023",,"B",20121128,20121129,,,,,,正式店舗名03B03a差分,セイシキテンポメイ03B03Aサブン,略式03B03a差分,リヤクシキ03B03Aサブン,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673024",,"B",20121128,20121129,,,,,,正式店舗名03B03b---+----2----+----3----+----4----+----5,セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8,略式03B03b-1----+,リヤクシキ03B03B---+----2----+----3----+----4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673025",,"B",20121128,20121129,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673026",,"B",20121128,20121129,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673030",,"B",20121128,20121129,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673031",,"B",20121128,20121129,,,,,,,,,,,13,205,007,010,198-0036,東京都青梅市河辺町10-45-1 03B05a,トウキヨウト オウメシ カベマチ 10-45-1 03B05A,10-45-1-03B05,3,3,3,3,7,5,6,3,,,,,,,,,,,,,,,, +"102","03","3673032",,"B",20121128,20121129,,,,,,,,,,,13,102,024,002,103-0007,東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5,トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6,2-45-1-03B05B,3,3,5,2,7,7,12,2,,,,,,,,,,,,,,,, +"102","03","3673033",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,@,03-3249-8231,,,,,,,,,,,,,, +"102","03","3673034",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,03-3249-8232,,,,,,,,,,,,,, +"102","03","3673035",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,1,@,,,,,,,,,,,,,, +"102","03","3673036",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,472,,,,,,,,,,,,, +"102","03","3673040",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,86,,,,,,,,,,,, +"102","03","3673041",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,代表者名 03B09a,ダイヒヨウシヤメイ 03B09A,,,,,,,,,, +"102","03","3673042",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,代表者名 03B09b---+----2,ダイヒヨウシヤメイ 03B09B--2,,,,,,,,,, +"102","03","3673043",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,@,,,,,,,,,, +"102","03","3673044",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,201301,,,,,,,, +"102","03","3673045",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,, +"102","03","3673046",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,201210,,,,,, +"102","03","3673047",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,201209,,,,,, +"102","03","3673048",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,, +"102","03","3673051",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,管理薬剤師名 03B12a,カンリヤクザイシメイ 03B12A,,,, +"102","03","3673052",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,管理薬剤師名 03B12b-+----2,カンリヤクザイシメイ 03B12B-2,,,, +"102","03","3673053",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,@,,,, +"102","03","3673055",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,03,3673054,, +"102","03","3673061",,"B",20121128,20121129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,03,3673060,, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv new file mode 100644 index 00000000..75421028 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv new file mode 100644 index 00000000..429a4ded --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv @@ -0,0 +1,38 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"456","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/18 10:27:00","com_pharm_mapper" +"789","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27","com_pharm_mapper","2023/4/18 10:27","com_pharm_mapper" +"033673002","85",,"セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85",,"セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a",,,,,,,,"1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85",,"セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85",,"セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85",,"セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85",,"セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85",,"セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85",,"セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85",,"セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673031","85",,"セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85",,"セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85",,"セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a",,,,,,,"1",,,"トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85",,"セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85",,"セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85",,"セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","85",,"セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85",,"セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85",,"セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b",,,,,"ダイヒヨウシヤメイ 03B09B","代表者名 03B09b",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85",,"セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c",,,,,"ダイヒヨウシヤメイ 03B09C","代表者名 03B09c",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85",,"セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a",,"1",,"201212",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85",,"セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b",,"1",,"201210",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85",,"セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85",,"セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85",,"セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85",,"セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85",,"セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","07071202","03030502","471",,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85",,"セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","07071202","03030502","471",,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85",,"セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","07071202","03030502","471",,,,,"33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv new file mode 100644 index 00000000..85f84a5c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","20121128","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","200501","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv new file mode 100644 index 00000000..e4d10126 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv @@ -0,0 +1,120 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"033673000","85",,"セイシキテンポメイ03","リヤクシキ03","正式店舗名03","略式03",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","東京都中央区日本橋浜町2-45-1 03","103-0007","13102242","13","102","2-45-1-03","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673001","85",,"セイシキテンポメイ03A01A","リヤクシキ03A01A","正式店舗名03A01a","略式03A01a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","東京都中央区日本橋浜町2-45-1 03A01a","103-0007","13102242","13","102","2-45-1-03A01A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673002","85",,"セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673003","85",,"セイシキテンポメイ03A01B-02","リヤクシキ03A01B-02","正式店舗名03A01b-02","略式03A01b-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673004","85",,"セイシキテンポメイ03A01C","リヤクシキ03A01C","正式店舗名03A01c","略式03A01c",,"1",,"201212",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","東京都中央区日本橋浜町2-45-1 03A01c","103-0007","13102242","13","102","2-45-1-03A01C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673005","85",,"セイシキテンポメイ03A01D","リヤクシキ03A01D","正式店舗名03A01d","略式03A01d",,,,,,,,"1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","東京都中央区日本橋浜町2-45-1 03A01d","103-0007","13102242","13","102","2-45-1-03A01D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85",,"セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a",,,,,,,,"1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85",,"セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85",,"セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673015","85",,"セイシキテンポメイ03B02C-02","リヤクシキ03B02C-02","正式店舗名03B02c-02","略式03B02c-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85",,"セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85",,"セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673021","85",,"セイシキテンポメイ03B02D-03","リヤクシキ03B02D-03","正式店舗名03B02d-03","略式03B02d-03",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85",,"セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85",,"セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85",,"セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673031","85",,"セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85",,"セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85",,"セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a",,,,,,,"1",,,"トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85",,"セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85",,"セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85",,"セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","85",,"セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85",,"セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85",,"セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b",,,,,"ダイヒヨウシヤメイ 03B09B","代表者名 03B09b",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85",,"セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c",,,,,"ダイヒヨウシヤメイ 03B09C","代表者名 03B09c",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85",,"セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a",,"1",,"201212",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85",,"セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b",,"1",,"201210",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85",,"セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85",,"セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85",,"セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85",,"セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85",,"セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","07071202","03030502","471",,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85",,"セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","07071202","03030502","471",,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673054","89",,"セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85",,"セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673056","89",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673060","89",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","07071202","03030502","471",,,,,"33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673062","89",,"セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673063","85",,"セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","07071202","03030502","471",,,,,"33673062","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673801","85",,"セイシキテンポメイモジ1","リヤクシキモジ1","□","□",,,,,"ダイヒヨウシヤメイモジ1 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ1","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-1","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ1 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673802","85",,"セイシキテンポメイモジ2","リヤクシキモジ2","□","□",,,,,"ダイヒヨウシヤメイモジ2 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ2","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-2","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ2 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673803","85",,"セイシキテンポメイモジ3","リヤクシキモジ3","□","□",,,,,"ダイヒヨウシヤメイモジ3 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ3","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-3","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ3 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673804","85",,"セイシキテンポメイモジ4","リヤクシキモジ4","","",,,,,"ダイヒヨウシヤメイモジ4 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ4","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-4","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ4 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673805","85",,"セイシキテンポメイモジ5","リヤクシキモジ5","","",,,,,"ダイヒヨウシヤメイモジ5 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ5","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-5","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ5 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673806","85",,"セイシキテンポメイモジ6","リヤクシキモジ6","","",,,,,"ダイヒヨウシヤメイモジ6 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ6","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-6","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ6 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673807","85",,"セイシキテンポメイモジ7","リヤクシキモジ7","□□□□□","□□□□□",,,,,"ダイヒヨウシヤメイモジ7 タロウ","□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ7","東京都中央区日本橋浜町2-45-1 □□□□□","103-0007","13102242","13","102","2-45-1-7","07071202","03030502","471",,,"□□□□□ 太郎","カンリヤクザイシメイモジ7 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673808","85",,"セイシキテンポメイモジ8","リヤクシキモジ8","□□□□□","□□□□□",,,,,"ダイヒヨウシヤメイモジ8 タロウ","□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ8","東京都中央区日本橋浜町2-45-1 □□□□□","103-0007","13102242","13","102","2-45-1-8","07071202","03030502","471",,,"□□□□□ 太郎","カンリヤクザイシメイモジ8 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673809","85",,"セイシキテンポメイモジ9","リヤクシキモジ9","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ9 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ9","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-9","07071202","03030502","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ9 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673810","85",,"セイシキテンポメイモジ10","リヤクシキモジ10","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ10 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ10","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-10","07071202","03030502","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ10 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673811","85",,"セイシキテンポメイモジ11","リヤクシキモジ11","□□□□□□","□□□□□□",,,,,"ダイヒヨウシヤメイモジ11 タロウ","□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ11","東京都中央区日本橋浜町2-45-1 □□□□□□","103-0007","13102242","13","102","2-45-1-11","07071202","03030502","471",,,"□□□□□□ 太郎","カンリヤクザイシメイモジ11 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673812","85",,"セイシキテンポメイモジ12","リヤクシキモジ12","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ12 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ12","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-12","07071202","03030502","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ12 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673813","85",,"セイシキテンポメイモジ13","リヤクシキモジ13","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ13 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ13","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-13","07071202","03030502","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ13 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673814","85",,"セイシキテンポメイモジ14","リヤクシキモジ14","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ14 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ14","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-14","07071202","03030502","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ14 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673815","85",,"セイシキテンポメイモジ15","リヤクシキモジ15","□□□□","□□□□",,,,,"ダイヒヨウシヤメイモジ15 タロウ","□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ15","東京都中央区日本橋浜町2-45-1 □□□□","103-0007","13102242","13","102","2-45-1-15","07071202","03030502","471",,,"□□□□ 太郎","カンリヤクザイシメイモジ15 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673816","85",,"セイシキテンポメイモジ16","リヤクシキモジ16","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ16 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ16","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-16","07071202","03030502","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ16 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673817","85",,"セイシキテンポメイモジ17","リヤクシキモジ17","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ17 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ17","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-17","07071202","03030502","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ17 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673818","85",,"セイシキテンポメイモジ18","リヤクシキモジ18","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ18 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ18","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-18","07071202","03030502","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ18 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673819","85",,"セイシキテンポメイモジ19","リヤクシキモジ19","□□□□□□□□□□","□□□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ19 タロウ","□□□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ19","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","103-0007","13102242","13","102","2-45-1-19","07071202","03030502","471",,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ19 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673820","85",,"セイシキテンポメイモジ20","リヤクシキモジ20","□□□□□□□□□□","□□□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ20 タロウ","□□□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ20","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","103-0007","13102242","13","102","2-45-1-20","07071202","03030502","471",,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ20 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673821","85",,"セイシキテンポメイモジ21","リヤクシキモジ21","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ21 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ21","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-21","07071202","03030502","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ21 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673822","85",,"セイシキテンポメイモジ22","リヤクシキモジ22","","",,,,,"ダイヒヨウシヤメイモジ22 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ22","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-22","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ22 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673823","85",,"セイシキテンポメイモジ23","リヤクシキモジ23","","",,,,,"ダイヒヨウシヤメイモジ23 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ23","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-23","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ23 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673824","85",,"セイシキテンポメイモジ24","リヤクシキモジ24","","",,,,,"ダイヒヨウシヤメイモジ24 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ24","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-24","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ24 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673825","85",,"セイシキテンポメイモジ25","リヤクシキモジ25","","",,,,,"ダイヒヨウシヤメイモジ25 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ25","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-25","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ25 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673826","85",,"セイシキテンポメイモジ26","リヤクシキモジ26","□","□",,,,,"ダイヒヨウシヤメイモジ26 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ26","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-26","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ26 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673827","85",,"セイシキテンポメイモジ27","リヤクシキモジ27","","",,,,,"ダイヒヨウシヤメイモジ27 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ27","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-27","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ27 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673828","85",,"セイシキテンポメイモジ28","リヤクシキモジ28","","",,,,,"ダイヒヨウシヤメイモジ28 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ28","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-28","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ28 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673829","85",,"セイシキテンポメイモジ29","リヤクシキモジ29","","",,,,,"ダイヒヨウシヤメイモジ29 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ29","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-29","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ29 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673830","85",,"セイシキテンポメイモジ30","リヤクシキモジ30","□","□",,,,,"ダイヒヨウシヤメイモジ30 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ30","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-30","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ30 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673831","85",,"セイシキテンポメイモジ31","リヤクシキモジ31","","",,,,,"ダイヒヨウシヤメイモジ31 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ31","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-31","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ31 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673832","85",,"セイシキテンポメイモジ32","リヤクシキモジ32","","",,,,,"ダイヒヨウシヤメイモジ32 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ32","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-32","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ32 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673833","85",,"セイシキテンポメイモジ33","リヤクシキモジ33","","",,,,,"ダイヒヨウシヤメイモジ33 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ33","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-33","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ33 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673834","85",,"セイシキテンポメイモジ34","リヤクシキモジ34","□□","□□",,,,,"ダイヒヨウシヤメイモジ34 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ34","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-34","07071202","03030502","471",,,"□□ 太郎","カンリヤクザイシメイモジ34 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673835","85",,"セイシキテンポメイモジ35","リヤクシキモジ35","","",,,,,"ダイヒヨウシヤメイモジ35 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ35","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-35","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ35 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673836","85",,"セイシキテンポメイモジ36","リヤクシキモジ36","","",,,,,"ダイヒヨウシヤメイモジ36 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ36","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-36","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ36 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673837","85",,"セイシキテンポメイモジ37","リヤクシキモジ37","","",,,,,"ダイヒヨウシヤメイモジ37 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ37","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-37","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ37 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673838","85",,"セイシキテンポメイモジ38","リヤクシキモジ38","□","□",,,,,"ダイヒヨウシヤメイモジ38 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ38","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-38","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ38 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673839","85",,"セイシキテンポメイモジ39","リヤクシキモジ39","","",,,,,"ダイヒヨウシヤメイモジ39 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ39","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-39","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ39 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673840","85",,"セイシキテンポメイモジ40","リヤクシキモジ40","","",,,,,"ダイヒヨウシヤメイモジ40 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ40","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-40","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ40 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673841","85",,"セイシキテンポメイモジ41","リヤクシキモジ41","","",,,,,"ダイヒヨウシヤメイモジ41 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ41","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-41","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ41 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673842","85",,"セイシキテンポメイモジ42","リヤクシキモジ42","","",,,,,"ダイヒヨウシヤメイモジ42 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ42","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-42","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ42 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673843","85",,"セイシキテンポメイモジ43","リヤクシキモジ43","","",,,,,"ダイヒヨウシヤメイモジ43 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ43","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-43","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ43 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673844","85",,"セイシキテンポメイモジ44","リヤクシキモジ44","","",,,,,"ダイヒヨウシヤメイモジ44 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ44","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-44","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ44 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673845","85",,"セイシキテンポメイモジ45","リヤクシキモジ45","","",,,,,"ダイヒヨウシヤメイモジ45 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ45","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-45","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ45 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673846","85",,"セイシキテンポメイモジ46","リヤクシキモジ46","","",,,,,"ダイヒヨウシヤメイモジ46 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ46","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-46","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ46 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673847","85",,"セイシキテンポメイモジ47","リヤクシキモジ47","□","□",,,,,"ダイヒヨウシヤメイモジ47 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ47","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-47","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ47 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673848","85",,"セイシキテンポメイモジ48","リヤクシキモジ48","□","□",,,,,"ダイヒヨウシヤメイモジ48 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ48","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-48","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ48 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673849","85",,"セイシキテンポメイモジ49","リヤクシキモジ49","","",,,,,"ダイヒヨウシヤメイモジ49 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ49","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-49","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ49 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673850","85",,"セイシキテンポメイモジ50","リヤクシキモジ50","□","□",,,,,"ダイヒヨウシヤメイモジ50 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ50","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-50","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ50 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673851","85",,"セイシキテンポメイモジ51","リヤクシキモジ51","","",,,,,"ダイヒヨウシヤメイモジ51 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ51","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-51","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ51 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673852","85",,"セイシキテンポメイモジ52","リヤクシキモジ52","□","□",,,,,"ダイヒヨウシヤメイモジ52 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ52","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-52","07071202","03030502","471",,,"□ 太郎","カンリヤクザイシメイモジ52 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673853","85",,"セイシキテンポメイモジ53","リヤクシキモジ53","","",,,,,"ダイヒヨウシヤメイモジ53 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ53","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-53","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ53 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673854","85",,"セイシキテンポメイモジ54","リヤクシキモジ54","","",,,,,"ダイヒヨウシヤメイモジ54 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ54","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-54","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ54 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673855","85",,"セイシキテンポメイモジ55","リヤクシキモジ55","","",,,,,"ダイヒヨウシヤメイモジ55 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ55","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-55","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ55 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673856","85",,"セイシキテンポメイモジ56","リヤクシキモジ56","","",,,,,"ダイヒヨウシヤメイモジ56 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ56","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-56","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ56 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673857","85",,"セイシキテンポメイモジ57","リヤクシキモジ57","","",,,,,"ダイヒヨウシヤメイモジ57 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ57","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-57","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ57 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673858","85",,"セイシキテンポメイモジ58","リヤクシキモジ58","","",,,,,"ダイヒヨウシヤメイモジ58 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ58","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-58","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ58 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673859","85",,"セイシキテンポメイモジ59","リヤクシキモジ59","","",,,,,"ダイヒヨウシヤメイモジ59 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ59","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-59","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ59 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673860","85",,"セイシキテンポメイモジ60","リヤクシキモジ60","","",,,,,"ダイヒヨウシヤメイモジ60 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ60","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-60","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ60 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673861","85",,"セイシキテンポメイモジ61","リヤクシキモジ61","","",,,,,"ダイヒヨウシヤメイモジ61 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ61","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-61","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ61 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673862","85",,"セイシキテンポメイモジ62","リヤクシキモジ62","","",,,,,"ダイヒヨウシヤメイモジ62 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ62","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-62","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ62 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673863","85",,"セイシキテンポメイモジ63","リヤクシキモジ63","","",,,,,"ダイヒヨウシヤメイモジ63 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ63","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-63","07071202","03030502","471",,," 太郎","カンリヤクザイシメイモジ63 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673864","85",,"セイシキテンポメイモジ64","リヤクシキモジ64","□□","□□",,,,,"ダイヒヨウシヤメイモジ64 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ64","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-64","07071202","03030502","471",,,"□□ 太郎","カンリヤクザイシメイモジ64 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673865","85",,"セイシキテンポメイモジ65","リヤクシキモジ65","□□","□□",,,,,"ダイヒヨウシヤメイモジ65 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ65","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-65","07071202","03030502","471",,,"□□ 太郎","カンリヤクザイシメイモジ65 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673866","85",,"セイシキテンポメイモジ66","リヤクシキモジ66","鯵鰺鴬鶯蛎蠣撹攪竃竈","鯵鰺鴬鶯蛎蠣撹攪竃竈",,,,,"ダイヒヨウシヤメイモジ66 タロウ","鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ66","東京都中央区日本橋浜町2-45-1 鯵鰺鴬鶯蛎蠣撹攪竃竈","103-0007","13102242","13","102","2-45-1-66","07071202","03030502","471",,,"鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","カンリヤクザイシメイモジ66 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673867","85",,"セイシキテンポメイモジ67","リヤクシキモジ67","潅灌諌諫頚頸砿礦蕊蘂","潅灌諌諫頚頸砿礦蕊蘂",,,,,"ダイヒヨウシヤメイモジ67 タロウ","潅灌諌諫頚頸砿礦蕊蘂 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ67","東京都中央区日本橋浜町2-45-1 潅灌諌諫頚頸砿礦蕊蘂","103-0007","13102242","13","102","2-45-1-67","07071202","03030502","471",,,"潅灌諌諫頚頸砿礦蕊蘂 太郎","カンリヤクザイシメイモジ67 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673868","85",,"セイシキテンポメイモジ68","リヤクシキモジ68","靭靱賎賤壷壺砺礪梼檮","靭靱賎賤壷壺砺礪梼檮",,,,,"ダイヒヨウシヤメイモジ68 タロウ","靭靱賎賤壷壺砺礪梼檮 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ68","東京都中央区日本橋浜町2-45-1 靭靱賎賤壷壺砺礪梼檮","103-0007","13102242","13","102","2-45-1-68","07071202","03030502","471",,,"靭靱賎賤壷壺砺礪梼檮 太郎","カンリヤクザイシメイモジ68 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673869","85",,"セイシキテンポメイモジ69","リヤクシキモジ69","涛濤迩邇蝿蠅桧檜侭儘","涛濤迩邇蝿蠅桧檜侭儘",,,,,"ダイヒヨウシヤメイモジ69 タロウ","涛濤迩邇蝿蠅桧檜侭儘 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ69","東京都中央区日本橋浜町2-45-1 涛濤迩邇蝿蠅桧檜侭儘","103-0007","13102242","13","102","2-45-1-69","07071202","03030502","471",,,"涛濤迩邇蝿蠅桧檜侭儘 太郎","カンリヤクザイシメイモジ69 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673870","85",,"セイシキテンポメイモジ70","リヤクシキモジ70","薮藪篭籠","薮藪篭籠",,,,,"ダイヒヨウシヤメイモジ70 タロウ","薮藪篭籠 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ70","東京都中央区日本橋浜町2-45-1 薮藪篭籠","103-0007","13102242","13","102","2-45-1-70","07071202","03030502","471",,,"薮藪篭籠 太郎","カンリヤクザイシメイモジ70 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673871","85",,"セイシキテンポメイモジ71","リヤクシキモジ71","尭堯槙槇遥遙瑶瑤凜熙","尭堯槙槇遥遙瑶瑤凜熙",,,,,"ダイヒヨウシヤメイモジ71 タロウ","尭堯槙槇遥遙瑶瑤凜熙 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ71","東京都中央区日本橋浜町2-45-1 尭堯槙槇遥遙瑶瑤凜熙","103-0007","13102242","13","102","2-45-1-71","07071202","03030502","471",,,"尭堯槙槇遥遙瑶瑤凜熙 太郎","カンリヤクザイシメイモジ71 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673872","85",,"セイシキテンポメイモジ72","リヤクシキモジ72","ツッー-一医院薬鈴田","ツッー-一医院薬鈴田",,,,,"ダイヒヨウシヤメイモジ72 タロウ","ツッー-一医院薬鈴田 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ72","東京都中央区日本橋浜町2-45-1 ツッー-一医院薬鈴田","103-0007","13102242","13","102","2-45-1-72","07071202","03030502","471",,,"ツッー-一医院薬鈴田 太郎","カンリヤクザイシメイモジ72 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673873","66","NULL","セイカナ","リヤクカナ","正漢字","略漢字","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","ジユウシヨカナ","住所漢字","001-6234","61626364","61","62","NULL","05060708","01020304","471","NULL","NULL","NULL","NULL","NULL","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv new file mode 100644 index 00000000..c9dc8e9e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv @@ -0,0 +1,37 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"033673002","85","6","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","07071202","03030502","471","5","033673003",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85",,"セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a",,,,,,,,"NULL","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85","6","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","07071202","03030502","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","07071202","03030502","471","2",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85","6","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","07071202","03030502","471","5","033673015",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85","6","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471","7","033673021",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85","6","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","07071202","03030502","471","7","033673021",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","NULL","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","07071202","03030502","471","NULL",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85",,"セイシキテンポメイ03B03Aサブン","リヤクシキ03B03Aサブン","正式店舗名03B03a差分","略式03B03a差分",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85",,"セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8","リヤクシキ03B03B---+----2----+----3----+----4","正式店舗名03B03b---+----2----+----3----+----4----+----5","略式03B03b-1----+",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85","1","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","2","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","NULL","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85",,"セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6","東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5","103-0007","13102024002","13","102","2-45-1-03B05B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85",,"セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a",,,,,,,"NULL",,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85",,"セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b",,,,,,,,,"03-3249-8232","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85",,"セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c",,,,,,,"1",,"NULL","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85",,"セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","07071202","03030502","472",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","86",,"セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85",,"セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a",,,,,"ダイヒヨウシヤメイ 03B09A","代表者名 03B09a",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85",,"セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b",,,,,"ダイヒヨウシヤメイ 03B09B--2","代表者名 03B09b---+----2",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85",,"セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c",,,,,"NULL","NULL",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85",,"セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a",,"1",,"201301",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85",,"セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b",,"NULL",,"NULL",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85",,"セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85",,"セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1",,"201209",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85",,"セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","NULL",,"NULL",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","07071202","03030502","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85",,"セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","07071202","03030502","471",,,"管理薬剤師名 03B12a","カンリヤクザイシメイ 03B12A",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85",,"セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","07071202","03030502","471",,,"管理薬剤師名 03B12b-+----2","カンリヤクザイシメイ 03B12B-2",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85",,"セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","07071202","03030502","471",,,"NULL","NULL",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85",,"セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","07071202","03030502","471",,,,,"033673054","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","07071202","03030502","471",,,,,"033673060","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/19 08:27:33","com_pharm_mapper" +"456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","05060708","01020304","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" +"789","66","NULL","正カナ","略カナ","正漢字","略漢字","NULL","NULL","NULL","NULL","NULL","NULL","NULL","6","NULL","住所カナ","住所漢字","001-6234","61626364","61","62","NULL","05060708","01020304","471","NULL","NULL","NULL","NULL","NULL","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py new file mode 100644 index 00000000..15d046e4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_pharm_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPharmMapper: + """ レイアウト区分102: COM_薬局 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_薬局テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_薬局テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_pharm_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_pharm', + 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_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_薬局テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_pharm_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_pharm', + 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_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv new file mode 100644 index 00000000..ca4cadce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv @@ -0,0 +1,8 @@ +"028","01","A","20141113","20141114","" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","C","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","成育" +"028","06","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","07","A","20141113","20141114","心臓病" +"028","99","C","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv new file mode 100644 index 00000000..dc5032cd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv @@ -0,0 +1,7 @@ +"028","01","A","20141113","20141114","がん" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","A","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","成育" +"028","06","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv new file mode 100644 index 00000000..700df5d8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv @@ -0,0 +1,7 @@ +"028","01","A","20141113","20141114","" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","A","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","06","A","20141113","20141114","成育" +"028","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv new file mode 100644 index 00000000..6b9e4adf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv @@ -0,0 +1,7 @@ +"policy_med_cd","field_name","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" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"03","精神疾患","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"04","神経・筋疾患(筋ジスを含む)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"05","呼吸器疾患(結核を含む)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"06","成育","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv new file mode 100644 index 00000000..8595b154 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","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" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"03","精神疾患","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"04","神経・筋疾患(筋ジスを含む)","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"05","成育","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"06","呼吸器疾患(結核を含む)","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"99","あああ","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv new file mode 100644 index 00000000..8863326e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","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" +"01","","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 15:06:43","com_policy_med_mapper" +"02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20171019","20171019","20230425","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"05","成育","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"06","呼吸器疾患(結核を含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"07","心臓病","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:21:20","com_policy_med_mapper","2022/10/20 17:36:27","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv new file mode 100644 index 00000000..84587999 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","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" +"01","がん","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"02","循環器病","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"03","精神疾患","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"05","成育","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"06","呼吸器疾患(結核を含む)","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv new file mode 100644 index 00000000..b0d08781 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","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" +"01","","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:06:43","com_policy_med_mapper" +"02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"05","呼吸器疾患(結核を含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"06","成育","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py new file mode 100644 index 00000000..e0729d17 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_policy_med_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPolicyMedpMapper: + """ レイアウト区分028: COM_政策医療 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_政策医療テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_insert.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_政策医療テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_policy_med_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_policy_med', + 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_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_update.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_政策医療テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_policy_med_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_policy_med', + 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_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_delete.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv new file mode 100644 index 00000000..ee22668f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv @@ -0,0 +1,7 @@ +"005","011","A","20141113","20141114","理事長" +"005","012","A","20141113","20141114","理事" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","" +"005","015","A","20141113","20141114","常任理" +"005","016","C","20141113","20141114","誉理事" +"005","021","A","20141113","20141114","誉会長" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv new file mode 100644 index 00000000..b5b7efa5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv @@ -0,0 +1,7 @@ +"005","011","A","20141113","20141114","理事長" +"005","012","A","20141113","20141114","理事" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","常務理" +"005","015","A","20141113","20141114","常任理" +"005","016","A","20141113","20141114","誉理事" +"005","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv new file mode 100644 index 00000000..c27a867d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv @@ -0,0 +1,6 @@ +"005","011","A","20141113","20141114","理事" +"005","012","A","20141113","20141114","理事長" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","" +"005","015","A","20141113","20141114","常任理" +"005","016","A","20141113","20141114","誉理事" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv new file mode 100644 index 00000000..ceb7e085 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","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" +"011","理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"012","理事長","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"013","副理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"014","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"015","常任理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"016","誉理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv new file mode 100644 index 00000000..ffb77574 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","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" +"011","理事長","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"012","理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"013","副理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"014","常務理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"015","常任理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"016","誉理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv new file mode 100644 index 00000000..8ea72f18 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv @@ -0,0 +1,8 @@ +"post_cd","form_post_name","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" +"011","理事長","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"012","理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"013","副理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"014","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"015","常任理","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"016","誉理事","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"021","誉会長","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 11:00:25","com_post_mapper","2023/05/14 11:00:25","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv new file mode 100644 index 00000000..e1ccea70 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv @@ -0,0 +1,8 @@ +"post_cd","form_post_name","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" +"011","理事長","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"012","理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"013","副理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"014","常務理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"015","常任理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"016","誉理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv new file mode 100644 index 00000000..0b2e436d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","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" +"011","理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"012","理事長","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"013","副理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"014","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"015","常任理","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"016","誉理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py new file mode 100644 index 00000000..e440dbb7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_post_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPostMapper: + """レイアウト区分005: COM_役職""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_役職テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_insert.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_役職テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_post_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_post', + 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_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_update.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_役職テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_post_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_post', + 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_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_delete.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv new file mode 100644 index 00000000..fc160243 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv @@ -0,0 +1,3 @@ +"132","00","9900194","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","00","9901649","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","00","9929798","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv new file mode 100644 index 00000000..de5f5b03 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv @@ -0,0 +1,8 @@ +"132","00","9900146",,"A","2","20141113","20141114","20140624",,"1",,,,,,"1","1",,,,,,,,,,,,,,"18.8",,,,,,,,"20130401","20140331","49.8","20130401","20140331",,,,,,,,,,,,,,,,,,,,"39.3",,,,,,,,"20130401","20140331" +"132","00","9900194",,"A","2","20141113","20141114","20121101",http://www.hospital.misawa.aomori.jp/,"1",1,1,0,20100401,20110331,"1","1",1,1,1,1,1,1,1,1,1,1,1,1,3,"205.4",,,,,,,,"20100401","20110331","468.1","20100401","20110331",8.3,20100401,20110331,,,,,,,,,,,,,,,,,"18.7",,,,,,0.0,,"20100401","20110331" +"132","00","9901649",,"A","2","20141113","20141114",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"132","00","9901679",,"A","2","20141113","20141114","20140627",http://www.kai-sei-kai.com/,"1",,,,,,"1","1",1,1,1,,1,,,,,1,,1,2,"58.5",229.2,102.3,131.3,,,,,"20130401","20140331","96.0","20130401","20140331",,,,,,,,,,,,,,,,,,,,"20.4",641.3,533.2,749.2,,,,,"20130401","20140331" +"132","00","9929798",,"A","2","20141113","20141114","20130611",http://www.urakawa.jrc.or.jp/,"1",,,,,,"1","1",1,1,1,,1,,,,,,,1,1,"114.6",46.6,,,39.9,0.0,0.0,,"20120401","20130331","481.6","20120401","20130331",16.2,20120401,20130331,,,,,,,,,,,,,,,,,"15.6",555.3,,,169.4,0.0,0.0,,"20120401","20130331" +"132","99","9999999",88,"A","2","20141113","20141114","@",@,"@",@,@,@,@,@,"@","@",@,@,@,@,@,@,@,@,@,@,@,@,@,"@",@,@,@,@,@,@,@,"@","@","@","@","@",@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,"@",@,@,@,@,@,@,@,"@","@" +"132","99","9999999",89,"A","2","20141113","20141114","@",@,"@",@,@,4444,20100401,20110331,"@","@",@,@,@,@,@,@,1,1,1,@,@,@,12345,"@",146.6,114.5,39.2,679.4,753.1,951.3,0.0,"20120401","20130331","@","20220430","20220517",@,20230623,20230707,@,147258,369147,258369,987654,321789,753159,842862,20200202,20200220,@,20220222,20230330,@,20060606,20070707,"@",159.3,25.6,154.1,35.1,397.8,65.7,62.5,"19980430","19990501" +"132","99","9999999",99,"A","2","20141113","20141114","20130611",aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz,"1",2,3,4444,20150101,20160101,"1","1",1,1,1,1,1,1,1,1,1,1,1,1,123,"12345.6",12345.6,12345.6,12345.6,12345.6,12345.6,12345.6,12345.6,"20120401","20130331","12345.6","20120401","20130331",12345.6,20120401,20130331,123467,123467,123467,123467,123467,123467,123467,123467,20200202,20200202,123467,20200202,20200202,123467,20200202,20200202,"12345.6",12345.6,12345.6,12345.6,12345.6,12345.6,12345.6,12345.6,"20120401","20130331" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv new file mode 100644 index 00000000..7c7c790a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv @@ -0,0 +1,6 @@ +"132","00","9900146","","B","","20141113","20141114","@","http://yahoo.co.jp/","@","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","","55.5","66.6","","","","","","","" +"132","00","9900194","","B","","20141113","20141114","20121101","http://www.hospital.misawa.aomori.jp/","","","@","","","","","","","","@","","@","@","","","","","","","","@","","","","","","","","","","@","","","@","","","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","@","","","","","","","","","" +"132","00","9901679","","B","","20141113","20141114","20171009","","","","","","","","@","@","@","@","","","","","1","2","3","5","4","@","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","" +"132","99","9999999","99","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","99","9999999","00","A","2","20141113","20141114","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@" +"132","99","9999999","11","A","2","20141113","20141114","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv new file mode 100644 index 00000000..71ec28ac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","NULL","NULL","NULL","NULL","1","1","1","1","NULL","1","NULL","NULL","NULL","NULL","NULL","1","1","1","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv new file mode 100644 index 00000000..36e197b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","20140624","","1","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20130401","20140331","49.8","20130401","20140331","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","1","0","20100401","20110331","1","1","1","1","1","1","1","1","1","1","1","1","1","1","3","205.4","","","","","","","","20100401","20110331","468.1","20100401","20110331","8.3","20100401","20110331","","","","","","","","","","","","","","","","","18.7","","","","","","0.0","","20100401","20110331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20140627","http://www.kai-sei-kai.com/","1","","","","","","1","1","1","1","1","","1","","","","","1","","1","2","58.5","229.2","102.3","131.3","","","","","20130401","20140331","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","20.4","641.3","533.2","749.2","","","","","20130401","20140331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"99999999900","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" +"99999999911","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv new file mode 100644 index 00000000..8c2f6318 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv @@ -0,0 +1,3 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv new file mode 100644 index 00000000..f9da8a45 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","20140624",,"1",,,,,,"1","1",,,,,,,,,,,,,,"18.8",,,,,,,,"20130401","20140331","49.8","20130401","20140331",,,,,,,,,,,,,,,,,,,,"39.3",,,,,,,,"20130401","20140331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","1","0","20100401","20110331","1","1","1","1","1","1","1","1","1","1","1","1","1","1","3","205.4",,,,,,,,"20100401","20110331","468.1","20100401","20110331","8.3","20100401","20110331",,,,,,,,,,,,,,,,,"18.7",,,,,,"0.0",,"20100401","20110331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009901649",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009901679","20140627","http://www.kai-sei-kai.com/","1",,,,,,"1","1","1","1","1",,"1",,,,,"1",,"1","2","58.5","229.2","102.3","131.3",,,,,"20130401","20140331","96.0","20130401","20140331",,,,,,,,,,,,,,,,,,,,"20.4","641.3","533.2","749.2",,,,,"20130401","20140331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1",,,,,,"1","1","1","1","1",,"1",,,,,,,"1","1","114.6","46.6",,,"39.9","0.0","0.0",,"20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331",,,,,,,,,,,,,,,,,"15.6","555.3",,,"169.4","0.0","0.0",,"20120401","20130331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999988","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","com_prefc_med_base_mapper","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999989","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","com_prefc_med_base_mapper","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv new file mode 100644 index 00000000..032b6891 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 11:49:28","com_prefc_med_base_mapper" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","NULL","NULL","NULL","NULL","1","1","1","1","NULL","1","NULL","NULL","NULL","NULL","NULL","1","1","1","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 14:52:00","com_prefc_med_base_mapper" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 11:49:28","com_prefc_med_base_mapper" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"99999999900","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20130331","20230510","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999911","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py new file mode 100644 index 00000000..84905c02 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py @@ -0,0 +1,198 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_base_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedBaseMapper: + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_base_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_base', + 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_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_base_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_base', + 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_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_base')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv new file mode 100644 index 00000000..7c1bb46d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv @@ -0,0 +1,4 @@ +"134","00","9901679","","B","2201","1","20141205","20141213","" +"134","00","9901679","","B","2203","1","20141205","20141213","" +"134","00","9901679","","B","2205","1","20141205","20141213","" +"134","00","9901679","","B","2206","1","20141205","20141213","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv new file mode 100644 index 00000000..8091022c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv @@ -0,0 +1,9 @@ +"134","00","9901649","","A","1001","2","20141113","20141114","" +"134","00","9901679","","A","2201","2","20141113","20141114","" +"134","00","9901679","","A","2203","2","20141113","20141114","2789" +"134","00","9901679","","A","2205","2","20141113","20141114","2033" +"134","00","9901679","","A","2206","2","20141113","20141114","0" +"134","00","9929798","","A","0902","2","20141113","20141114","" +"134","00","9929798","","A","0915","2","20141113","20141114","" +"134","99","9999999","99","A","1234","2","20141113","20141114","123456" +"134","99","9999999","99","A","1235","2","20141113","20141114","@" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv new file mode 100644 index 00000000..4def216a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv @@ -0,0 +1,7 @@ +"134","00","9901649","","B","1001","2","20141113","20141114","0" +"134","00","9901679","","B","2203","2","20141113","20141114","@" +"134","00","9901679","","B","2205","2","20141113","20141114","1987" +"134","00","9901679","","B","2206","2","20141113","20141114","@" +"134","00","9929798","","B","0902","2","20141113","20141114","0" +"134","00","9929798","","B","0915","2","20141113","20141114","543" +"134","99","9999999","99","B","1234","2","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv new file mode 100644 index 00000000..ee268b92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2205","1987","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2206","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0902","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0915","543","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv new file mode 100644 index 00000000..aad1b86e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","2789","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2205","2033","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2206","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009929798","0902","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009929798","0915","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"99999999999","1234","1111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv new file mode 100644 index 00000000..d1d53673 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0902","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0915","543","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv new file mode 100644 index 00000000..4e56268a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2201","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2203","2789","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2205","2033","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2206","0","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0902","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0915","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0915","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"99999999999","1234","123456","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"99999999999","1235","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv new file mode 100644 index 00000000..baecab69 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2205","1987","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2206","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009929798","0902","0","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009929798","0915","543","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"99999999999","1234","1111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py new file mode 100644 index 00000000..003b87b1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py @@ -0,0 +1,253 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_dis_treat_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedDisTreatMapper: + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_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_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_dis_treat_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_dis_treat', + 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_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_physical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_dis_treat_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_dis_treat', + 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_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_dis_treat')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv new file mode 100644 index 00000000..826055ac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv @@ -0,0 +1,3 @@ +"133","00","9900194","","B","008","1","20141211","20141213","" +"133","00","9901649","","B","009","1","20141211","20141213","" +"133","00","9901679","","B","015","1","20141211","20141213","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv new file mode 100644 index 00000000..83362ab7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv @@ -0,0 +1,6 @@ +"133","00","9900146","","A","012","2","20141113","20141114","0" +"133","00","9900194","","A","008","2","20141113","20141114","32" +"133","00","9901649","","A","009","2","20141113","20141114","3" +"133","00","9901679","","A","015","2","20141113","20141114","" +"133","00","9904439","","A","006","2","20141113","20141114","" +"133","00","9929798","","A","010","2","20141113","20141114","@" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv new file mode 100644 index 00000000..24111866 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv @@ -0,0 +1,7 @@ +"133","99","9999999","99","B","111","2","20141113","20141114","" +"133","00","9900146","","B","012","2","20141113","20141114","@" +"133","00","9900194","","B","008","2","20141113","20141114","@" +"133","00","9901649","","B","009","2","20141113","20141114","6" +"133","00","9901679","","B","015","2","20141113","20141114","@" +"133","00","9904439","","B","006","2","20141113","20141114","10" +"133","00","9929798","","B","010","2","20141113","20141114","9" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv new file mode 100644 index 00000000..94330b4f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009900194","008","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009901649","009","6","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009901679","015","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009904439","006","10","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009929798","010","9","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv new file mode 100644 index 00000000..c75a3f89 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009900194","008","32","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009901649","009","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009901679","015","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009904439","006","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009929798","010","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"99999999999","111","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv new file mode 100644 index 00000000..32074199 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009904439","006","10","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009929798","010","9","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv new file mode 100644 index 00000000..caad9918 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","0","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009900194","008","32","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009901649","009","3","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009901679","015","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009904439","006","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009929798","010","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv new file mode 100644 index 00000000..88bc0809 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009900194","008","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009901649","009","6","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009901679","015","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009904439","006","10","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009929798","010","9","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"99999999999","111","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py new file mode 100644 index 00000000..5372b7cd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py @@ -0,0 +1,252 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_equpment_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedEqupmentMapper: + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_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_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_equpment_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_equpment', + 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_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), 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_physical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_equpment_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_equpment', + 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_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_equpment')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv new file mode 100644 index 00000000..0e25331e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv @@ -0,0 +1,3 @@ +"135","00","9901679","","B","101","1","20141210","20141213" +"135","00","9901679","","B","102","1","20141209","20141213" +"135","00","9901679","","B","111","1","20141208","20141213" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv new file mode 100644 index 00000000..daf6f1f9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv @@ -0,0 +1,7 @@ +"135","00","9900146","","A","213","2","20141113","20141114" +"135","00","9900146","","A","214","2","20141113","20141114" +"135","00","9900146","","A","215","2","20141113","20141114" +"135","00","9901679","","A","101","2","20141113","20141114" +"135","00","9901679","","A","102","2","20141113","20141114" +"135","00","9929798","","A","110","2","20141113","20141114" +"135","00","9929798","","A","111","2","20141113","20141114" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv new file mode 100644 index 00000000..5c75d14c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv @@ -0,0 +1,4 @@ +"135","00","9901679","","B","101","2","20141113","20141114" +"135","00","9901679","","B","111","2","20141113","20141114" +"135","00","9929798","","B","111","2","20141113","20141114" +"135","00","9929798","","B","211","2","20141113","20141114" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv new file mode 100644 index 00000000..90f5e825 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv @@ -0,0 +1,10 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","111","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","211","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv new file mode 100644 index 00000000..72dda2ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv new file mode 100644 index 00000000..5adfd71e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","211","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv new file mode 100644 index 00000000..995277be --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009900146","214","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009900146","215","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009901679","101","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009901679","102","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009929798","110","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009929798","111","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv new file mode 100644 index 00000000..d4377bc4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv @@ -0,0 +1,10 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","111","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009929798","211","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py new file mode 100644 index 00000000..f08193a6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py @@ -0,0 +1,240 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_sojourn_ope_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedSojournOpeMapper: + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(短期滞在手術)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_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_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_都道府県医療機能情報(短期滞在手術)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sojourn_ope_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sojourn_ope', + 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_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(短期滞在手術)テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sojourn_ope_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sojourn_ope', + 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_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_sojourn_ope')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv new file mode 100644 index 00000000..4ce0fddb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv @@ -0,0 +1 @@ +"136","00","9929798","","B","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","20141211","20141213","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv new file mode 100644 index 00000000..49cdc733 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv @@ -0,0 +1,8 @@ +"136","99","9999999","88","A","あいうえお","2","20141113","20141114","123","@" +"136","00","9901649","","A","テスト 小児 内分泌・腎臓外来","2","20141113","20141114","5","030" +"136","00","9904439","","A","テスト アルコール症専門外来","2","20141113","20141114","1","019" +"136","00","9904439","","A","テスト メンタルヘルス専門外来","2","20141113","20141114","7","019" +"136","00","9904439","","A","テスト 禁煙専門外来","2","20141113","20141114","2","001" +"136","00","9904439","","A","テスト 糖尿病外来","2","20141113","20141114","7","006" +"136","00","9929798","","A","テスト ストーマ(人工肛門・人工膀胱)専門外来","2","20141113","20141114","1","014" +"136","99","9999999","99","A","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","2","20141113","20141114","111","222" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv new file mode 100644 index 00000000..e157aee6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv @@ -0,0 +1,6 @@ +"136","00","9901649","","B","テスト 小児 内分泌・腎臓外来","2","20141113","20141114","5","019" +"136","00","9904439","","B","テスト 禁煙専門外来","2","20141113","20141114","2","@" +"136","00","9904439","","B","テスト 糖尿病外来","2","20141113","20141114","7","001" +"136","00","9929798","","B","テスト ストーマ(人工肛門・人工膀胱)専門外来","2","20141113","20141114","1","@" +"136","99","9999999","11","B","あいうえお","2","20141113","20141114","","999" +"136","99","9999999","99","B","あいうえお","2","20141113","20141114","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv new file mode 100644 index 00000000..6e0c952c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","001","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv new file mode 100644 index 00000000..3266575e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","030","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","001","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","006","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"99999999911","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"99999999999","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv new file mode 100644 index 00000000..6184e1ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","001","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv new file mode 100644 index 00000000..86c95e0f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"99999999988","あいうえお","123","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sp_outpat_mapper","2017/10/08 20:57:12","com_prefc_med_sp_outpat_mapper" +"009901649","テスト 小児 内分泌・腎臓外来","5","030","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト アルコール症専門外来","1","019","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト メンタルヘルス専門外来","7","019","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 禁煙専門外来","2","001","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 糖尿病外来","7","006","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","014","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"99999999999","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","111","222","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv new file mode 100644 index 00000000..33d5e48f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 糖尿病外来","7","001","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"99999999911","あいうえお","123","999","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:57:12","com_prefc_med_sp_outpat_mapper" +"99999999999","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py new file mode 100644 index 00000000..54d034a3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py @@ -0,0 +1,240 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_sp_outpat_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedSpOutpatMapper: + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(専門外来)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_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_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_都道府県医療機能情報(専門外来)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sp_outpat_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sp_outpat', + 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_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(専門外来)テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sp_outpat_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sp_outpat', + 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_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_sp_outpat')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv new file mode 100644 index 00000000..4c50f5fc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv @@ -0,0 +1,4 @@ +"026","01","C","20141113","20141114","" +"026","99","A","20141113","20141114","不明" +"026","02","A","20141113","20141114","骨折" +"026","98","C","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv new file mode 100644 index 00000000..09a4e485 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv @@ -0,0 +1,3 @@ +"026","01","A","20141113","20141114","大腿骨頸部骨折" +"026","99","A","20141113","20141114","不明" +"026","55","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv new file mode 100644 index 00000000..7b84a0ff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv @@ -0,0 +1,3 @@ +"026","01","A","20141113","20141114","頸部骨折" +"026","99","A","20141113","20141114","" +"026","55","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv new file mode 100644 index 00000000..bd263ca7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv @@ -0,0 +1,3 @@ +"regn_co_critic_pass_cd","disease_name_kanji","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" +"01","大腿骨頸部骨折","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:17","clsComRegnCriticPass" +"99","不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:51","clsComRegnCriticPass" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv new file mode 100644 index 00000000..e8c2ba1e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","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" +"01","大腿骨頸部骨折","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","clsComRegnCriticPass" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv new file mode 100644 index 00000000..12548de0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","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" +"01","大腿骨頸部骨折","20171019","NULL","20230420","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:17","com_regn_critic_pass_mapper" +"02","骨折","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:18:53","com_regn_critic_pass_mapper","2017/10/19 11:18:53","com_regn_critic_pass_mapper" +"99","不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:51","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv new file mode 100644 index 00000000..81ce5d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","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" +"01","大腿骨頸部骨折","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv new file mode 100644 index 00000000..35151deb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","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" +"01","頸部骨折","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","","20171024","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py new file mode 100644 index 00000000..738d7ea4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_regn_critic_pass_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComRegnCriticPassMapper: + """レイアウト区分026: COM_地域連携クリティカルパス""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_地域連携クリティカルパス校テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_insert.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_地域連携クリティカルパス校テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_regn_critic_pass_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_regn_critic_pass', + 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_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_update.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_地域連携クリティカルパス校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_regn_critic_pass_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_regn_critic_pass', + 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_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_delete.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv new file mode 100644 index 00000000..85d5cb95 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv @@ -0,0 +1,7 @@ +"027","01","A","20141113","20141114","" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","C","20141113","20141114","廃用症候群リハビリテーション" +"027","05","A","20141113","20141114","心大血管疾患リハビリテーション" +"027","06","A","20141113","20141114","糖尿病リハビリテーション" +"027","99","C","20141113","20141114","糖尿病リハビリテーション" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv new file mode 100644 index 00000000..a3d3096b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv @@ -0,0 +1,6 @@ +"027","01","A","20141113","20141114","脳血管疾患等リハビリテーション" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","A","20141113","20141114","心大血管疾患リハビリテーション" +"027","05","A","20141113","20141114","廃用症候群リハビリテーション" +"027","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv new file mode 100644 index 00000000..a9450b84 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv @@ -0,0 +1,5 @@ +"027","01","A","20141113","20141114","" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","A","20141113","20141114","廃用症候群リハビリテーション" +"027","05","A","20141113","20141114","心大血管疾患リハビリテーション" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv new file mode 100644 index 00000000..50610683 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","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" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"03","呼吸器リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"04","廃用症候群リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"05","心大血管疾患リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv new file mode 100644 index 00000000..5990cb40 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","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" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"03","呼吸器リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"04","心大血管疾患リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"05","廃用症候群リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv new file mode 100644 index 00000000..e2554dc6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv @@ -0,0 +1,7 @@ +"rehabili_cd","rehabili_name","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" +"01","","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","com_rehabili_mapper" +"02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"04","廃用症候群リハビリテーション","20171019","20171019","20230423","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"05","心大血管疾患リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"06","糖尿病リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:01:11","com_rehabili_mapper","2022/10/19 15:01:11","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv new file mode 100644 index 00000000..1e292c75 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv @@ -0,0 +1,7 @@ +"rehabili_cd","rehabili_name","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" +"01","脳血管疾患等リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"02","運動器リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"04","心大血管疾患リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"05","廃用症候群リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv new file mode 100644 index 00000000..00891218 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","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" +"01","","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","com_rehabili_mapper" +"02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"04","廃用症候群リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"05","心大血管疾患リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py new file mode 100644 index 00000000..29d44f4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_rehabili_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComRehabiliMapper: + """レイアウト区分027: COM_疾患別リハビリテーション科""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_疾患別リハビリテーション科テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_insert.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_疾患別リハビリテーション科テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_rehabili_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_rehabili', + 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_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_update.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_疾患別リハビリテーション科テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_rehabili_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_rehabili', + 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_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_delete.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv new file mode 100644 index 00000000..61c5c614 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv @@ -0,0 +1,3 @@ +"123","01","01","C","20141113","20141114","","","","","","" +"123","01","02","C","20141113","20141114","南檜山圏","1","213","216","20130201","3" +"123","01","09","C","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv new file mode 100644 index 00000000..690a500f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv @@ -0,0 +1,4 @@ +"123","01","01","A","20141113","20141114","南渡島圏","1","4475","5020","20130201","545" +"123","01","02","A","20141113","20141114","","","","","","" +"123","01","03","B","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" +"123","99","99","A","","","あいうえおかきくけこあいうえおかきくけこ","9","123456","123456","20130201","1234567" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv new file mode 100644 index 00000000..348ff11c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv @@ -0,0 +1,3 @@ +"123","01","01","A","20141113","20141114","","","","","","" +"123","01","02","A","20141113","20141114","南檜山圏","1","213","216","20130201","3" +"123","01","03","B","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv new file mode 100644 index 00000000..8fab7f4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_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" +"01","01","","","NULL","NULL","","","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" +"01","02","1","南檜山圏","213","216","20130201","3","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv new file mode 100644 index 00000000..23b503f5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_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" +"01","01","1","南渡島圏","4475","5020","20130201","545","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" +"01","02","","","NULL","NULL","","","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv new file mode 100644 index 00000000..3ec5fff5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv @@ -0,0 +1,2 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_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" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv new file mode 100644 index 00000000..f5a43770 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv @@ -0,0 +1,5 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_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" +"01","01","1","南渡島圏","4475","5020","20130201","545","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"01","02","","","NULL","NULL","","","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"99","99","9","あいうえおかきくけこあいうえおかきくけこ","123456","123456","20130201","1234567","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv new file mode 100644 index 00000000..6e212e05 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_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" +"01","01","","","NULL","NULL","","","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" +"01","02","1","南檜山圏","213","216","20130201","3","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py new file mode 100644 index 00000000..82e12baa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py @@ -0,0 +1,257 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_snd_med_sphe_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSndMedSphe: + """レイアウト区分123: COM_医療圏二次医療圏""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # decimal型のカラム群 + decimal_columns = [ + 'requd_bed_or_equip_target', + 'exist_bed_num' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏二次医療圏テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_insert.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_update_record(self): + """ + Cases: + COM_医療圏二次医療圏テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_snd_med_sphe_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_snd_med_sphe', + 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_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_update.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), 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_physical_delete(self): + """ + Cases: + COM_医療圏二次医療圏テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_snd_med_sphe_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_snd_med_sphe', + 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_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_snd_med_sphe')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv new file mode 100644 index 00000000..97dbe515 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv @@ -0,0 +1,7 @@ +"009","001","A","20141113","20141114","" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","C","20141113","20141114","生化" +"009","005","A","20141113","20141114","病理" +"009","006","A","20141113","20141114","薬理" +"009","007","A","20141113","20141114","癌" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv new file mode 100644 index 00000000..ebdea438 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv @@ -0,0 +1,7 @@ +"009","001","A","20141113","20141114","医史" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","A","20141113","20141114","生化" +"009","005","A","20141113","20141114","薬理" +"009","006","A","20141113","20141114","病理" +"009","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv new file mode 100644 index 00000000..bb8eb3ba --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv @@ -0,0 +1,6 @@ +"009","001","A","20141113","20141114","" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","A","20141113","20141114","生化" +"009","005","A","20141113","20141114","病理" +"009","006","A","20141113","20141114","薬理" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv new file mode 100644 index 00000000..87bee255 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv @@ -0,0 +1,7 @@ +"sosiety_cd","sosiety_name","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" +"001","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"002","解剖","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"003","生理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"004","生化","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"005","病理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"006","薬理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv new file mode 100644 index 00000000..5447e8b3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","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" +"001","医史","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"002","解剖","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"003","生理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"004","生化","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"005","薬理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"006","病理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"999","あいう","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv new file mode 100644 index 00000000..ff96fbec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","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" +"001","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"002","解剖","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"003","生理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"004","生化","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"005","病理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"006","薬理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"007","癌","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:50:50","com_sosiety_mapper","2023/05/15 16:50:50","com_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv new file mode 100644 index 00000000..8da80c1a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","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" +"001","医史","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"002","解剖","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"003","生理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"004","生化","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"005","薬理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"006","病理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv new file mode 100644 index 00000000..d8c4d20a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","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" +"001","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"002","解剖","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"003","生理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"004","生化","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"005","病理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"006","薬理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"999","あいう","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py new file mode 100644 index 00000000..1fd345b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_sosiety_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSosietyMapper: + """レイアウト区分009: COM_学会""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_学会テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_insert.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_学会テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sosiety_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sosiety', + 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_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_update.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_学会テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sosiety_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sosiety', + 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_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_delete.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv new file mode 100644 index 00000000..11bd1155 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv @@ -0,0 +1,5 @@ +"511","01","994301","00","B","0003","1","20141211","20141213","","","","","","" +"511","01","995783","00","B","0003","1","20141211","20141213","","","","","","" +"511","01","997682","00","B","0004","1","20141211","20141213","","","","","","" +"511","01","997906","00","B","0032","1","20141211","20141213","","","","","","" +"511","01","999613","00","B","0056","1","20141211","20141213","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv new file mode 100644 index 00000000..b68e46d0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv @@ -0,0 +1,8 @@ +"511","01","994301","00","A","0003","2","20141113","20141114","","","1","20140401","","" +"511","01","995783","00","A","0003","2","20141113","20141114","","","1","20140401","","" +"511","01","997682","00","A","0004","2","20141113","20141114","1","20131112","","","","" +"511","01","997906","00","A","0032","2","20141113","20141114","1","20130821","","","1","20130821" +"511","01","999613","00","A","0056","2","20141113","20141114","1","20140706","","","1","20140706" +"511","91","999999","99","B","9999","2","","","1","20220628","1","20230425","1","20230425" +"511","99","999999","99","A","9999","2","","","1","20220628","1","20230425","1","20230425" +"511","01","999988","99","A","9999","2",,,"@","20220628","@","20230425","@","20230425" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv new file mode 100644 index 00000000..b7585d8d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv @@ -0,0 +1,5 @@ +"511","01","994301","00","B","0003","2","20161113","20161114","1","20170401","@","","","" +"511","01","995783","00","B","0003","2","20161113","20161114","1","20170221","1","20140810","","" +"511","01","997906","00","B","0032","2","20170330","20170401","@","","","","@","" +"511","01","999613","00","B","0056","2","20161113","20161114","1","20180706","1","20170101","1","20180706" +"511","01","999613","00","B","9999","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv new file mode 100644 index 00000000..978f2a55 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","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" +"0199430100","0003","2","1","20170401","NULL","NULL","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","NULL","NULL","","","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv new file mode 100644 index 00000000..5c48b4e0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","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" +"0199430100","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199578300","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","1","20130821","","","1","20130821","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199961300","0056","2","1","20140706","","","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv new file mode 100644 index 00000000..f5423592 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv @@ -0,0 +1,2 @@ +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","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" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv new file mode 100644 index 00000000..8b5f1ad2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv @@ -0,0 +1,9 @@ +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","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" +"0199430100","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199578300","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199768200","0004","2","1","20131112","","","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199790600","0032","2","1","20130821","","","1","20130821","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199961300","0056","2","1","20140706","","","1","20140706","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"9199999999","9999","2","1","20220628","1","20230425","1","20230425","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"9999999999","9999","2","1","20220628","1","20230425","1","20230425","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199998899","9999","2","NULL","NULL","NULL","NULL","NULL","NULL","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv new file mode 100644 index 00000000..83316e37 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv @@ -0,0 +1,6 @@ +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","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" +"0199430100","0003","2","1","20170401","NULL","NULL","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","NULL","NULL","","","NULL","NULL","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py new file mode 100644 index 00000000..3f9a4d1f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py @@ -0,0 +1,238 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_sp_field_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSpFieldMapper: + """レイアウト区分511: COM_専門分野""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_専門分野テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_insert.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialist_cd = :specialist_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_専門分野テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sp_field_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sp_field', + 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_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_update.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialist_cd = :specialist_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_専門分野テーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sp_field_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sp_field', + 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_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_sp_field')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialist_cd = :specialist_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_delete.csv new file mode 100644 index 00000000..79d312c4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_delete.csv @@ -0,0 +1,7 @@ +"010","0001","A","20141113","20141114","" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","C","20141113","20141114","放射線科専門医" +"010","0006","A","20141113","20141114","眼科専門医" +"010","0007","A","20141113","20141114","耳鼻咽喉科専門医" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_insert.csv new file mode 100644 index 00000000..34854679 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_insert.csv @@ -0,0 +1,7 @@ +"010","0001","A","20141113","20141114","皮膚科専門医" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","A","20141113","20141114","眼科専門医" +"010","0006","A","20141113","20141114","放射線科専門医" +"010","9999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_update.csv new file mode 100644 index 00000000..f598cab6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_update.csv @@ -0,0 +1,6 @@ +"010","0001","A","20141113","20141114","" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","A","20141113","20141114","放射線科専門医" +"010","0006","A","20141113","20141114","眼科専門医" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv new file mode 100644 index 00000000..b1732476 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv @@ -0,0 +1,7 @@ +"specialist_cd","specialist_license_name","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" +"0001","","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0003","麻酔科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0004","産婦人科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0005","放射線科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0006","眼科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv new file mode 100644 index 00000000..bac063fe --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv @@ -0,0 +1,8 @@ +"specialist_cd","specialist_license_name","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" +"0001","皮膚科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0002","整形外科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0003","麻酔科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0004","産婦人科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0005","眼科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0006","放射線科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"9999","ああああ","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv new file mode 100644 index 00000000..74e4b021 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv @@ -0,0 +1,8 @@ +"specialist_cd","specialist_license_name","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" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0005","放射線科専門医","20171024","20171024","20230515","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0007","耳鼻咽喉科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:47:40","com_specialist_license_mapper","2023/05/15 12:47:40","com_specialist_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv new file mode 100644 index 00000000..92acbfc8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv @@ -0,0 +1,8 @@ +"specialist_cd","specialist_license_name","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" +"0001","皮膚科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0002","整形外科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0003","麻酔科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0004","産婦人科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0005","眼科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0006","放射線科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"9999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv new file mode 100644 index 00000000..6a33cc35 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv @@ -0,0 +1,8 @@ +"specialist_cd","specialist_license_name","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" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0002","整形外科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0005","放射線科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"9999","ああああ","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py new file mode 100644 index 00000000..857e1c65 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_specialist_license_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSpecialistLicenseMapper: + """レイアウト区分010: COM_専門医資格""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_専門医資格テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_insert.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_専門医資格テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialist_license_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_specialist_license', + 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_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_update.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_専門医資格テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialist_license_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_specialist_license', + 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_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_delete.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv new file mode 100644 index 00000000..39844d66 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv @@ -0,0 +1,3 @@ +"122","01","1","C","20141118","20141122","" +"122","01","2","C","20141118","20141122","オホーツク" +"122","01","9","C","20141118","20141122","道北" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv new file mode 100644 index 00000000..6c299222 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv @@ -0,0 +1,4 @@ +"122","01","1","A","20141118","20141122","道南" +"122","01","2","A","20141118","20141122","" +"122","01","3","A","20141118","20141122","道北" +"122","99","12345678","A","","","あいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv new file mode 100644 index 00000000..3050ce0d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv @@ -0,0 +1,3 @@ +"122","01","1","A","20141118","20141122","" +"122","01","2","A","20141118","20141122","オホーツク" +"122","01","3","B","20141118","20141122","道北" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv new file mode 100644 index 00000000..475396aa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" +"01","2","オホーツク","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" +"01","3","道北","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv new file mode 100644 index 00000000..5c15d8c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","道南","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" +"01","2","","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" +"01","3","道北","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv new file mode 100644 index 00000000..513fbde7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv @@ -0,0 +1,2 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","3","道北","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv new file mode 100644 index 00000000..68dc24d7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv @@ -0,0 +1,5 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","道南","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"01","2","","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"01","3","道北","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"99","12345678","あいうえおかきくけこあいうえおかきくけこ","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv new file mode 100644 index 00000000..29268282 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" +"01","2","オホーツク","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" +"01","3","道北","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py new file mode 100644 index 00000000..5440f431 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py @@ -0,0 +1,238 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_thrd_med_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComThrdMedMapper: + """レイアウト区分122: COM_医療圏3次マスタ""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏3次マスタテーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_insert.csv')) + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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_医療圏3次マスタテーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_thrd_med_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_thrd_med', + 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_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_update.csv')) + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_physical_delete(self): + """ + Cases: + COM_医療圏3次マスタテーブルのレコードを1件物理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_thrd_med_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_thrd_med', + 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_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_thrd_med')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv new file mode 100644 index 00000000..a676cbda --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv @@ -0,0 +1,7 @@ +"001","A01","A","20141113","20141114","","","" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","C","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","A06","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" +"001","A07","A","20141113","20141114","内薬","内科(薬物療法)","ナイカ(ヤクブツリヨウホウ)" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv new file mode 100644 index 00000000..e3b96df2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv @@ -0,0 +1,7 @@ +"001","A01","A","20141113","20141114","内","一般内科","イツパンナイカ" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","A","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" +"001","A06","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","999","A","","","あいうえ","あいうえおかきくけこあいうえおかきくけこ","アイウエオカキクケコアイウエオカキクケコケコ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv new file mode 100644 index 00000000..e092df90 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv @@ -0,0 +1,6 @@ +"001","A01","A","20141113","20141114","","","" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","A","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","A06","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv new file mode 100644 index 00000000..19181a3b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","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" +"A01","","","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv new file mode 100644 index 00000000..2dc257c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","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" +"A01","イツパンナイカ","内","一般内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A05","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A06","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv new file mode 100644 index 00000000..a60d80b4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv @@ -0,0 +1,8 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","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" +"A01","","","","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/11 09:16:56","com_trt_course_mapper" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A07","ナイカ(ヤクブツリヨウホウ)","内薬","内科(薬物療法)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:16:56","com_trt_course_mapper","2017/10/20 9:16:56","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv new file mode 100644 index 00000000..6c9ce9f1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv @@ -0,0 +1,8 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","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" +"999","アイウエオカキクケコアイウエオカキクケコケコ","あいうえ","あいうえおかきくけこあいうえおかきくけこ","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A01","イツパンナイカ","内","一般内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A05","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A06","ナイカ(ジユンカンキ)","内循","内科(循環器)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv new file mode 100644 index 00000000..1bc94e34 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","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" +"A01","","","","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py new file mode 100644 index 00000000..9646fc63 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_trt_course_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComTrtCourseMapper: + """レイアウト区分001: COM_診療科目""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_診療科目テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_insert.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_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']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_診療科目テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_course_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_trt_course', + 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_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_update.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + COM_診療科目テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_course_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_trt_course', + 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_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_delete.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv new file mode 100644 index 00000000..753f271a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"04","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv new file mode 100644 index 00000000..4097a7c9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"02","青森県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"04","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"05","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv new file mode 100644 index 00000000..4998fe00 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv @@ -0,0 +1,8 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"04","秋田県","","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"07","福島県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:22:55","mst_prefc_mapper","2023/05/14 15:22:55","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv new file mode 100644 index 00000000..59b8b231 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv @@ -0,0 +1,8 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"02","青森県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"04","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"05","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"99","あいうえお","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv new file mode 100644 index 00000000..3fef3d10 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"04","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv new file mode 100644 index 00000000..f5b68b65 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv @@ -0,0 +1,7 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","C","20141113","20141114","秋田県","04" +"006","24","A","20141113","20141114","宮城県","05" +"006","25","A","20141113","20141114","山形県","06" +"006","26","A","20141113","20141114","福島県","07" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv new file mode 100644 index 00000000..65801d98 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv @@ -0,0 +1,7 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","青森県","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","A","20141113","20141114","宮城県","04" +"006","24","A","20141113","20141114","秋田県","05" +"006","25","A","20141113","20141114","山形県","06" +"006","","A","","","あいうえお","99" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv new file mode 100644 index 00000000..cf9dcddf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv @@ -0,0 +1,6 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","A","20141113","20141114","秋田県","04" +"006","24","A","20141113","20141114","宮城県","05" +"006","25","A","20141113","20141114","山形県","06" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py new file mode 100644 index 00000000..9023ffef --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import mst_prefc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestMstPrefcMapper: + """レイアウト区分006: 都道府県マスタ""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + 都道府県マスタテーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_insert.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + 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: + 都道府県マスタテーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_mst_prefc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.mst_prefc', + 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: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_update.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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_logical_delete(self): + """ + Cases: + 都道府県マスタテーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_mst_prefc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.mst_prefc', + 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: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_delete.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in 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}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py new file mode 100644 index 00000000..bf9b2629 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -0,0 +1,1376 @@ +"""vjsk_file_check用テストフィクスチャoverride""" + + +import os + +import boto3 +import pytest + + +@pytest.fixture +def s3_client(): + conn = boto3.client('s3') + yield conn + + +@pytest.fixture +def bucket_name(): + return os.environ["VJSK_DATA_BUCKET"] + + +@pytest.fixture +def receive_folder(): + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] + + +@pytest.fixture +def init_check_received_files_ok1(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ok2(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng01(s3_client, bucket_name, receive_folder): + # setup + + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng02(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng03(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng04(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng05(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng06(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng07(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng08(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng09(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng10(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng11(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng12(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng13(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng14(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng15(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng16(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng17(s3_client, bucket_name, receive_folder): + # setup + + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz') diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py new file mode 100644 index 00000000..1c523d0e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -0,0 +1,303 @@ +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.vjsk.vjsk_importer import _check_received_files +from src.error.exceptions import BatchOperationException + + +def test_check_received_files_ok1(init_check_received_files_ok1): + """ + 観点 + 正常系 : 卸在庫データ取込対象日 + 期待値 + 例外が発生しない + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + received_s3_files = _check_received_files() + + assert received_s3_files is not None + + # target_path = path.dirname(__file__) + # target_file = "xxxxxxxxxxxx000000000000.gz" + # s3_client.upload_file() + + +def test_check_received_files_ok2(init_check_received_files_ok2): + """ + 観点 + 正常系 : 卸在庫データ取込対象日以外 + 期待値 + 例外が発生しない + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = False + + received_s3_files = _check_received_files() + # with pytest.raises(BatchOperationException): + # received_s3_files = _check_received_files() + + assert received_s3_files is not None + + +def test_check_received_files_ng01(init_check_received_files_ng01): + """ + 観点 + 異常系 : 卸在庫データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸在庫データファイルがありません") > 0 + + +def test_check_received_files_ng02(init_check_received_files_ng02): + """ + 観点 + 異常系 : 卸販売データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸販売データファイルがありません") > 0 + + +def test_check_received_files_ng03(init_check_received_files_ng03): + """ + 観点 + 異常系 : 卸組織変換マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸組織変換マスタファイルがありません") > 0 + + +def test_check_received_files_ng04(init_check_received_files_ng04): + """ + 観点 + 異常系 : 施設統合マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("施設統合マスタファイルがありません") > 0 + + +def test_check_received_files_ng05(init_check_received_files_ng05): + """ + 観点 + 異常系 : 卸マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸マスタファイルがありません") > 0 + + +def test_check_received_files_ng06(init_check_received_files_ng06): + """ + 観点 + 異常系 : 卸ホールディングスマスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸ホールディングスマスタファイルがありません") > 0 + + +def test_check_received_files_ng07(init_check_received_files_ng07): + """異常系 : 施設マスタファイルが欠落""" + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("施設マスタファイルがありません") > 0 + + +def test_check_received_files_ng08(init_check_received_files_ng08): + """ + 観点 + 異常系 : メーカー卸組織展開表ファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("メーカー卸組織展開表ファイルがありません") > 0 + + +def test_check_received_files_ng09(init_check_received_files_ng09): + """異常系 : 取引区分マスタファイルが欠落""" + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("取引区分マスタファイルがありません") > 0 + + +def test_check_received_files_ng10(init_check_received_files_ng10): + """ + 観点 + 異常系 : 製品マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製品マスタファイルがありません") > 0 + + +def test_check_received_files_ng11(init_check_received_files_ng11): + """ + 観点 + 異常系 : 製品価格マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製品価格マスタファイルがありません") > 0 + + +def test_check_received_files_ng12(init_check_received_files_ng12): + """ + 観点 + 異常系 : 卸得意先情報マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸得意先情報マスタファイルがありません") > 0 + + +def test_check_received_files_ng13(init_check_received_files_ng13): + """ + 観点 + 異常系 : MDBコード変換マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("MDBコード変換マスタファイルがありません") > 0 + + +def test_check_received_files_ng14(init_check_received_files_ng14): + """ + 観点 + 異常系 : 生物由来データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("生物由来データファイルがありません") > 0 + + +def test_check_received_files_ng15(init_check_received_files_ng15): + """ + 観点 + 異常系 : 製造ロット番号マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製造ロット番号マスタファイルがありません") > 0 + + +def test_check_received_files_ng16(init_check_received_files_ng16): + """ + 観点 + 異常系 : 想定外のファイルが受領されている(卸在庫データ取込対象日) + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("想定数を超える受領ファイルがあります") > 0 + + +def test_check_received_files_ng17(init_check_received_files_ng17): + """ + 観点 + 異常系 : 想定外のファイルが受領されている(卸在庫データ取込対象日) + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = False + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("想定数を超える受領ファイルがあります") > 0 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py new file mode 100644 index 00000000..dc77a65f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py @@ -0,0 +1,41 @@ +"""vjsk_load用テストフィクスチャoverride""" +import os + +import boto3 +import pytest + +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper + + +@pytest.fixture +def s3_client(): + conn = boto3.client('s3') + yield conn + + +@pytest.fixture +def bucket_name(): + return os.environ["VJSK_DATA_BUCKET"] + + +@pytest.fixture +def receive_folder(): + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] + + +@pytest.fixture +def mapper(): + return VjskReceiveFileMapper() + +# @pytest.fixture +# def init_Load_ok(s3_client, bucket_name, receive_folder): +# # setup + +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + +# # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py new file mode 100644 index 00000000..de7ddcb3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -0,0 +1,2037 @@ +import time +from os import path + +import pytest + +from src.aws.s3 import VjskReceiveBucket +from src.batch.common.batch_context import BatchContext +from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager +# from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager +from src.batch.vjsk.vjsk_importer import (_check_received_files, + _import_file_to_db) +from src.db.database import Database +from src.error.exceptions import BatchOperationException +# from tests.testing_vjsk_utility import create_vjsk_assertion_dictionary +from tests.testing_vjsk_utility import (assert_table_results, + create_vjsk_assertion_list) + + +class TestImportFileToDb: + """ + V実消化データ取込-データベース登録処理 テストクラス + """ + db: Database + batch_context: BatchContext + test_file_path_import_all: str + test_file_path_load_individual: str + test_file_path_unzip_error: str + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + # setup + self.test_file_path_import_all = path.join(path.dirname(__file__), "testdata", "TestImportFileToDb") + self.test_file_path_load_individual = path.join(path.dirname(__file__), "testdata") + self.test_file_path_unzip_error = path.join(path.dirname(__file__), "testdata", "UnzipError") + + self.batch_context = BatchContext.get_instance() + + self.db = database + self.db.connect() + self.db.execute("set sql_mode = 'TRADITIONAL';") + self.db.to_jst() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_import_file_to_db_ok(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 正常系 : すべての受領データをデータベースに登録できる + 期待値 + 例外が発生しない + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path_import_all, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_HLD_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_FCL_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST)}") + + # assertion + received_s3_files = _check_received_files() + _import_file_to_db(received_s3_files) + + # 検証 + condkey = mapper.CONDKEY_STOCK_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_ORG_CNV_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_VOP_HCO_MERGE + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_WHS_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_HLD_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_FCL_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_MKR_ORG_HORIZON + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_TRAN_KBN_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_PHM_PRD_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_PHM_PRICE_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_WHS_CUSTOMER_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_MDB_CONV_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_BIO_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_LOT_NUM_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + def test_load_01_stock_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_STOCK_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "stock_slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "stock_slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_02_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_03_org_cnv_mst_ok(self, mapper): + # V卸組織変換マスタにはNULL変換対象の文字列型カラムがない + table_name_org = mapper.get_org_table(mapper.CONDKEY_ORG_CNV_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "org_cnv_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "org_cnv_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.whs_cd = o.whs_cd and s.whs_sub_cd = o.whs_sub_cd and s.org_cd = o.org_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_04_vop_hco_merge_ok(self, mapper): + # V施設統合マスタにはNULL変換対象の文字列型カラムがない + table_name_org = mapper.get_org_table(mapper.CONDKEY_VOP_HCO_MERGE) + table_name_src = mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, "vop_hco_merge_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, "vop_hco_merge_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_inst_cd = o.v_inst_cd and s.apply_dt = o.apply_dt)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_05_whs_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_WHS_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_WHS_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.v_whs_cd = o.v_whs_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_06_hld_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_HLD_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_HLD_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "hld_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "hld_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.v_hld_cd = o.v_hld_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_07_fcl_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_FCL_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_FCL_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "fcl_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # 日付型に変換して比較する項目 + force_cast_to_str_columns = ['closed_dt', 'ins_dt', 'upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, force_cast_to_str_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # 日付型に変換して比較する項目 + force_cast_to_str_columns = ['closed_dt', 'ins_dt', 'upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns, force_cast_to_str_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "fcl_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # 日付型に変換して比較する項目 + force_cast_to_str_columns = ['closed_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, force_cast_to_str_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.v_inst_cd = o.v_inst_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # 日付型に変換して比較する項目 + force_cast_to_str_columns = ['closed_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns, force_cast_to_str_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_08_mkr_org_horizon_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_MKR_ORG_HORIZON) + table_name_src = mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, "mkr_org_horizon_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 0row +insert 4row) ※PK項目がないテーブルなのですべてinsertになる + + assetion1_done_dt = self.db.execute_select("select SYSDATE()")[0]["SYSDATE()"] + + # assertion2でinsertされたレコードをdwh_upd_dtで判断するため、assertion1からの実行間隔を明確に空けるためにスリープを挟む + time.sleep(3) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, "mkr_org_horizon_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} where dwh_upd_dt > :dt_value", {"dt_value": assetion1_done_dt}) + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 0row + insert 4row = 10row) ※PK項目がないテーブルなのですべてinsertになる + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 10 + + # teardown + + def test_load_09_tran_kbn_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_TRAN_KBN_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "tran_kbn_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "tran_kbn_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.v_tran_cd = o.v_tran_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_10_phm_prd_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_PHM_PRD_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_prd_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_prd_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.prd_cd = o.prd_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_11_phm_price_mst_ok(self, mapper): + # V製品価格マスタにはNULL変換対象の文字列型カラムがない + table_name_org = mapper.get_org_table(mapper.CONDKEY_PHM_PRICE_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.phm_prd_cd = o.phm_prd_cd and s.phm_price_kind = o.phm_price_kind and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_12_whs_customer_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_WHS_CUSTOMER_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_customer_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src} order by customer_cd") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_customer_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.whs_cd = o.whs_cd and s.whs_sub_cd = o.whs_sub_cd and s.customer_cd = o.customer_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_13_mdb_conv_mst_ok(self, mapper): + # MDBコード変換表にはNULL変換対象の文字列型カラムがない + table_name_org = mapper.get_org_table(mapper.CONDKEY_MDB_CONV_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "mdb_conv_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "mdb_conv_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.hco_vid_v = o.hco_vid_v and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_14_bio_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_BIO_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "bio_slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "bio_slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_load_15_lot_num_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_LOT_NUM_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 6row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "lot_num_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src} order by ser_num, lot_num") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "lot_num_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, is_loaddata=True) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select s.* from {table_name_src} s inner join {table_name_org} o on (s.ser_num = o.ser_num and s.lot_num = o.lot_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 6row + update 2row + insert 2row = 8row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 8 + + # teardown + + def test_unzip_to_error(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 異常系 : gzファイルが解凍できない + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload + # ※.gzだが、7zipで圧縮してあるので、解凍に失敗するのが期待値 + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path_unzip_error, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + # assertion + received_s3_files = _check_received_files() + with pytest.raises(Exception) as e: + _import_file_to_db(received_s3_files) + + # 検証 + assert str(e.value) == "Not a gzipped file (b'7z')" + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + def test_s3backup_ok(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 正常系 : S3受領ファイルのバックアップフォルダ移動が完了する + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload + # ※.gzだが、7zipで圧縮してあるので、解凍に失敗するのが期待値 + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path_import_all, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + # assertion + received_s3_files = _check_received_files() + vjsk_recv_bucket.backup_dat_file(received_s3_files, "test") + + # 検証 + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + def test_s3backup_to_error(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 異常系 : S3受領ファイルのバックアップフォルダ移動ができない + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup + + # assertion + with pytest.raises(Exception) as e: + # 有りもしないファイルをバックアップフォルダにコピーさせてコケさせる + received_s3_files = [] + received_s3_files.append({"filename": "dummy.dummy"}) + vjsk_recv_bucket.backup_dat_file(received_s3_files, "test") + + # 検証 + assert str(e.value) == "An error occurred (404) when calling the HeadObject operation: Not Found" + + # teardown + + def test_load_format_error_01(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "stock_slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_02(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_03(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "org_cnv_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_04(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "vop_hco_merge_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_05(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "whs_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_06(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "hld_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_07(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "fcl_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_08(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "mkr_org_horizon_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_09(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "tran_kbn_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_10(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "phm_prd_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_11(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "phm_price_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_12(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "whs_customer_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_13(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "mdb_conv_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_14(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "bio_slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_15(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "lot_num_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_no_data_ok_01(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "stock_slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_02(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_03(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "org_cnv_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_04(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "vop_hco_merge_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_05(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "whs_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_06(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "hld_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_07(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "fcl_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_08(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "mkr_org_horizon_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_09(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "tran_kbn_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_10(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "phm_prd_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_11(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "phm_price_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_12(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "whs_customer_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_13(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "mdb_conv_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_14(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "bio_slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_15(self, mapper): + """ + 観点 + 正常系 : tsvファイルレコード0件の取込 + 期待値 + 例外が発生しないこと + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "lot_num_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv new file mode 100644 index 00000000..e2dccedb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv new file mode 100644 index 00000000..ccd44bbd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv new file mode 100644 index 00000000..27e3a2b4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv new file mode 100644 index 00000000..73c23a1f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv new file mode 100644 index 00000000..d8868820 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv new file mode 100644 index 00000000..afd4d124 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv @@ -0,0 +1 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv new file mode 100644 index 00000000..a4c52b43 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv new file mode 100644 index 00000000..a9ce545e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv new file mode 100644 index 00000000..362c753c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv new file mode 100644 index 00000000..8957ebc7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv new file mode 100644 index 00000000..4dcd83cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv new file mode 100644 index 00000000..67a2ed3d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv new file mode 100644 index 00000000..e707d5cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv @@ -0,0 +1 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv new file mode 100644 index 00000000..dc76587c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv new file mode 100644 index 00000000..6f760e14 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv new file mode 100644 index 00000000..0b359d23 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D452960211JD1111311102503851400002304016427519111 496350122バベンチオテンテキ200MG 1V ソウゴウメデイカルニホンコウカンビツクバシ タカサキ 753 BAVB007 000003 000000 000000 " "296" "02" "11JD11113111025" "0385140000" "496350122" "111" "230401" "20230401" "6427519" "バベンチオテンテキ200MG 1V " "ソウゴウメデイカルニホンコウカンビ" "ツクバシ タカサキ 753 " "BAVB007 " "000003" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000126" "129" "20230401" "202305082041" "110" "売上" "11JD" "300001370" "川崎南支店" "" "200000007" "アルフレッサ株式会社" "0385140000" "670235967013012526" "医療法人社団こうかん会 日本鋼管病院" "イリョウホウジンシャダンコウカンカイ ニホンコウカンビョウイン" "210-0852 神奈川県川崎市川崎区鋼管通1−2−1" "496350122" "バベンチオ 注射剤 200mg 1VIAL" "" "1" "" "3" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211G11111377452402930640002304016433215111 496300127ゴナ-ルエフヒカチユウペン450 1トウ セコム)オギクボビヨウイン トウキヨウト シブヤク ジングウマエ 1-5-1 GF4C001 000002 000000 000000 " "296" "02" "11G111113774524" "0293064000" "496300127" "111" "230401" "20230401" "6433215" "ゴナ-ルエフヒカチユウペン450 1トウ " "セコム)オギクボビヨウイン " "トウキヨウト シブヤク ジングウマエ 1-5-1 " "GF4C001 " "000002" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000127" "130" "20230401" "202305082041" "110" "売上" "11G1" "300001351" "杉並・中野支店" "" "200000007" "アルフレッサ株式会社" "0293064000" "670234652241314835" "医療法人財団荻窪病院 荻窪病院" "イリョウホウジンザイダンオギクボビョウイン オギクボビョウイン" "167-0035 東京都杉並区今川3−1−24" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "2" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211V11121120604204799500002304016461276111 496300134ゴナ-ルエフヒカチユウペン900 1トウ ニチイサ-ビスキユウシユウフクオカサンフクオカシ サワラク モモチハマ 1-7-5 7F GF9C002 000010 000000 000000 " "296" "02" "11V111211206042" "0479950000" "496300134" "111" "230401" "20230401" "6461276" "ゴナ-ルエフヒカチユウペン900 1トウ " "ニチイサ-ビスキユウシユウフクオカサン" "フクオカシ サワラク モモチハマ 1-7-5 7F " "GF9C002 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000128" "131" "20230401" "202305082041" "110" "売上" "11V1" "300001491" "福岡第一支店" "" "200000007" "アルフレッサ株式会社" "0479950000" "670235883412145206" "医療法人社団高邦会 福岡山王病院" "イリョウホウジンシャダンコウホウカイ フクオカサンノウビョウイン" "814-0001 福岡県福岡市早良区百道浜3−6−45" "496300134" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "02875 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv new file mode 100644 index 00000000..0125ec7d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229430760653825" "0" "20000101" "99991231" "" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "" "0" "700-0023 岡山県岡山市北区駅前町1−6−20" "オカヤマケン オカヤマシキタク エキマエチョウ1-6-20" "700-0023" "33" "岡山県" "岡山市北区" "駅前町1−6−20" "0862236468" "33101" "30" "1" "" "" +"670229435466662922" "0" "20000101" "99991231" "" "医療法人社団仁卓会 ほりかわ歯科クリニック" "イリョウホウジンシャダンジンタクカイ ホリカワシカクリニック" "ほりかわ歯科クリニック (医社)" "ホリカワシカクリニック (イシャ)" "" "0" "675-0101 兵庫県加古川市平岡町新在家1573−1−4F" "ヒョウゴケン カコガワシ ヒラオカチョウシンザイケ1573-1-4F" "675-0101" "28" "兵庫県" "加古川市" "平岡町新在家1573−1−4F" "0794244617" "28210" "30" "1" "" "" +"670229435785430019" "0" "20000101" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206529" "0" "20000101" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv new file mode 100644 index 00000000..9060a7da --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "卸ホールディングス名01-1" "オロシホールディングスメイ01-1" "卸名01-1" "20230101" "99991231" "1" "0" "23-05-09 12:00:01" "23-05-09 13:00:01" +"10001" "2" "卸ホールディングス名01-2" "オロシホールディングスメイ01-2" "卸名01-2" "20230102" "99991231" "1" "0" "23-05-09 12:00:02" "23-05-09 13:00:02" +"10001" "3" "卸ホールディングス名01-3" "オロシホールディングスメイ01-3" "卸名01-3" "20230103" "99991231" "1" "0" "23-05-09 12:00:03" "23-05-09 13:00:03" +"10001" "4" "卸ホールディングス名01-4" "オロシホールディングスメイ01-4" "卸 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv new file mode 100644 index 00000000..6978f030 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA001" "20230331" "20210510" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA002" "20230331" "20210615" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA003" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA004" "2 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv new file mode 100644 index 00000000..5b4d688d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229780011959315" "1" "003410424" "0" "20020601" "0" "22-03-09 13:56:19" "22-03-09 13:56:19" +"670230081112654862" "0" "004101420" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:17:34" +"670230081112654862" "1" "004104997" "2" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "3" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv new file mode 100644 index 00000000..6f108bcf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv @@ -0,0 +1,5 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"3" "300003202" "その他営業本部卸" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003138" "北関東甲信越営業本部" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"a" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv new file mode 100644 index 00000000..6151cd4e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"042" "01" "361007" "0" "300006657" "20230401" "99991231" "0" "0" "23-04-12 11:24:06" "23-04-12 11:24:06" +"042" "01" "381207" "0" "300006658" "20230401" "99991231" "0" "0" "23-04-12 11:24:27" "23-04-12 11:24:27" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv new file mode 100644 index 00000000..8324689b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496201110" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20080101" "20190930" "140" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496201127" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20070401" "20190930" "150" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496300110" "2" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "F1990608" "ゴナールエフ皮下注ペン 300" "GONAL-F PEN 300IU (1) - JPN" "005" "セロスティム" "ST" "F005" "皮下注ペン" "0000" "" "V017" "300IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "100" "9" "19-04-23 16:35:36" "19-04-23 16:40:38" +"496300127" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 1 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_price_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_price_mst_formaterror.tsv new file mode 100644 index 00000000..20ebb14d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_price_mst_formaterror.tsv @@ -0,0 +1,2 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"123456701" "01" "1" "12345.6" "202304 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv new file mode 100644 index 00000000..7b4b20b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D4420202011611A4 0183733 23030133625911102303 4963500230000020003110000000622000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362591" "000002" "00031100" "0000062200" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000022" "29" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "2" "31100" "62200" "31438" "62876" "35309" "70618" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4420202011611A4 0183733 23030133625921102303 4963500230000080003110000002488000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362592" "000008" "00031100" "0000248800" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000023" "30" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "31100" "248800" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000011" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv new file mode 100644 index 00000000..aa3cb22e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"D463630101 23022849630021900003500000 セトロタイドチユウシヤヨウ0.25MG 1V" "363" "01" "01 " "230228" "496300219" "000035" "0" "0000" " セトロタイドチユウシヤヨウ0.25MG 1V" "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000059" "59" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001270000040000001ゴナールエフヒカチユウペン450 1トウ40 " "253" "01" "026 " "230228" "496300127" "000004" "0" "0000" "01ゴナールエフヒカチユウペン450 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000060" "60" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000061" "61" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "2 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv new file mode 100644 index 00000000..34692f31 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "Veeva取引区分名01-1" "20230101" "99991231" "1" "0" "2023-05-09 12:00:01" "2023-05-09 13:00:01" +"10001" "2" "Veeva取引区分名01-2" "20230102" "99991231" "1" "0" "2023-05-09 12:00:02" "2023-05-09 13:00:02" +"10001" "3" "Veeva取引区分名01-3" "20230103" "99991231" "1" "0" "2023-05-09 12:00:03" "2023-05-09 13:00:03" +"10001" "4" "Veeva取引区分名01-4" "20230104" "9 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv new file mode 100644 index 00000000..f4e8956e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000001" "900000001" "20230509" "事由01" +"100000002" "900000002" "20230509" "事由02" +"100000003" "900000003" "20230509" "事由03" +"100000004" "900000004" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv new file mode 100644 index 00000000..0ec0c4cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1002900000" "0" "20000101" "99991231" "11" "1131A2283316" "辻内科小児科医院               " "ツジナイカシヨウニカ イイン" "長崎県 佐世保市皆瀬町29                   " "ナガサキケン サセボシカイゼチヨウ 29" "8570144" "0956492319" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1005400000" "0" "20000101" "99991231" "12" "1211C3415515" "医療法人 愛恵会 佐世保愛恵病院       " "イリヨウホウジンアイケイカイサセボアイケイビ" "長崎県 佐世保市瀬戸越4丁目 2−15             " "ナガサキケン サセボシセトゴシ 4チヨウメ 2-15" "8570134" "0956493335" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007200000" "0" "20000101" "99991231" "11" "1131A2407312" "医療法人 山祇診療所             " "イリヨウホウジンヤマズミシンリヨウジヨ" "長崎県 佐世保市山祇町 19−36               " "ナガサキケン サセボシヤマズミチョウ" "8570822" "0956313633" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007800000" "0" "20000101" "999912 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv new file mode 100644 index 00000000..82239889 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000002" "0" "株式会社モロオ" "カナ01" "モロオ" "1110001" "住所01" "ジュウショ01" "00-0000-0001" "0" "20000101" "99991231" "20" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000005" "0" "岩渕薬品株式会社" "カナ02" "岩渕薬品" "1110002" "住所02" "ジュウショ02" "00-0000-0002" "0" "20000101" "99991231" "50" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000009" "0" "株式会社マルタケ" "カナ03" "マルタケ" "1110003" "住所03" "ジュウショ03" "00-0000-0003" "0" "20000101" "99991231" "90" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000010" "0" "株式会社ファイネス" "カナ04" "ファイネス" "1110004" "住所04" "ジュ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/bio_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/bio_slip_data_202304270000.gz new file mode 100755 index 00000000..6ea16a9c Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/bio_slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/fcl_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/fcl_mst_202304270000.gz new file mode 100755 index 00000000..fffb9215 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/fcl_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/hld_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/hld_mst_202304270000.gz new file mode 100755 index 00000000..20c194a2 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/hld_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/lot_num_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/lot_num_mst_202304270000.gz new file mode 100755 index 00000000..6d6f7dd9 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/lot_num_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mdb_conv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mdb_conv_mst_202304270000.gz new file mode 100755 index 00000000..9b177904 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mdb_conv_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mkr_org_horizon_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mkr_org_horizon_202304270000.gz new file mode 100755 index 00000000..9eb2cd34 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mkr_org_horizon_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/org_cnv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/org_cnv_mst_202304270000.gz new file mode 100755 index 00000000..72b636f5 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/org_cnv_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_prd_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_prd_mst_202304270000.gz new file mode 100755 index 00000000..7d864d6f Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_prd_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_price_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_price_mst_202304270000.gz new file mode 100755 index 00000000..7cf9f449 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_price_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/slip_data_202304270000.gz new file mode 100755 index 00000000..82465aea Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/stock_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/stock_slip_data_202304270000.gz new file mode 100755 index 00000000..f36e25ca Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/stock_slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/tran_kbn_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/tran_kbn_mst_202304270000.gz new file mode 100755 index 00000000..77e7eac6 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/tran_kbn_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/vop_hco_merge_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/vop_hco_merge_202304270000.gz new file mode 100755 index 00000000..3671b2a6 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/vop_hco_merge_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_customer_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_customer_mst_202304270000.gz new file mode 100755 index 00000000..7c3bd6d4 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_customer_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_mst_202304270000.gz new file mode 100755 index 00000000..d41f560a Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz new file mode 100644 index 00000000..c609baff Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz new file mode 100644 index 00000000..7f532e3b Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/hld_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/hld_mst_202304270000.gz new file mode 100644 index 00000000..04ebc2c6 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/hld_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz new file mode 100644 index 00000000..821eccd4 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mdb_conv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mdb_conv_mst_202304270000.gz new file mode 100644 index 00000000..5acc776a Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mdb_conv_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz new file mode 100644 index 00000000..d6327182 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz new file mode 100644 index 00000000..1efc8e0f Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz new file mode 100644 index 00000000..c45076da Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_price_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_price_mst_202304270000.gz new file mode 100644 index 00000000..3c01fe7d Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_price_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz new file mode 100644 index 00000000..9c2dc3ad Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz new file mode 100644 index 00000000..3d741b23 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/tran_kbn_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/tran_kbn_mst_202304270000.gz new file mode 100644 index 00000000..b8a78cb9 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/tran_kbn_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz new file mode 100644 index 00000000..a698e631 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz new file mode 100644 index 00000000..88998e26 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz new file mode 100644 index 00000000..a97fdb31 Binary files /dev/null and b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz differ diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv new file mode 100644 index 00000000..b675c364 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv @@ -0,0 +1,7 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D452960211JD1111311102503851400002304016427519111 496350122バベンチオテンテキ200MG 1V ソウゴウメデイカルニホンコウカンビツクバシ タカサキ 753 BAVB007 000003 000000 000000 " "296" "02" "11JD11113111025" "0385140000" "496350122" "111" "230401" "20230401" "6427519" "バベンチオテンテキ200MG 1V " "ソウゴウメデイカルニホンコウカンビ" "ツクバシ タカサキ 753 " "BAVB007 " "000003" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000126" "129" "20230401" "202305082041" "110" "売上" "11JD" "300001370" "川崎南支店" "" "200000007" "アルフレッサ株式会社" "0385140000" "670235967013012526" "医療法人社団こうかん会 日本鋼管病院" "イリョウホウジンシャダンコウカンカイ ニホンコウカンビョウイン" "210-0852 神奈川県川崎市川崎区鋼管通1−2−1" "496350122" "バベンチオ 注射剤 200mg 1VIAL" "" "1" "" "3" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211G11111377452402930640002304016433215111 496300127ゴナ-ルエフヒカチユウペン450 1トウ セコム)オギクボビヨウイン トウキヨウト シブヤク ジングウマエ 1-5-1 GF4C001 000002 000000 000000 " "296" "02" "11G111113774524" "0293064000" "496300127" "111" "230401" "20230401" "6433215" "ゴナ-ルエフヒカチユウペン450 1トウ " "セコム)オギクボビヨウイン " "トウキヨウト シブヤク ジングウマエ 1-5-1 " "GF4C001 " "000002" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000127" "130" "20230401" "202305082041" "110" "売上" "11G1" "300001351" "杉並・中野支店" "" "200000007" "アルフレッサ株式会社" "0293064000" "670234652241314835" "医療法人財団荻窪病院 荻窪病院" "イリョウホウジンザイダンオギクボビョウイン オギクボビョウイン" "167-0035 東京都杉並区今川3−1−24" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "2" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211V11121120604204799500002304016461276111 496300134ゴナ-ルエフヒカチユウペン900 1トウ ニチイサ-ビスキユウシユウフクオカサンフクオカシ サワラク モモチハマ 1-7-5 7F GF9C002 000010 000000 000000 " "296" "02" "11V111211206042" "0479950000" "496300134" "111" "230401" "20230401" "6461276" "ゴナ-ルエフヒカチユウペン900 1トウ " "ニチイサ-ビスキユウシユウフクオカサン" "フクオカシ サワラク モモチハマ 1-7-5 7F " "GF9C002 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000128" "131" "20230401" "202305082041" "110" "売上" "11V1" "300001491" "福岡第一支店" "" "200000007" "アルフレッサ株式会社" "0479950000" "670235883412145206" "医療法人社団高邦会 福岡山王病院" "イリョウホウジンシャダンコウホウカイ フクオカサンノウビョウイン" "814-0001 福岡県福岡市早良区百道浜3−6−45" "496300134" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "0287503000" "496300127" "111" "230401" "20230401" "6523689" "ゴナ-ルエフヒカチユウペン450 1トウ " "イツカンドウヤツキヨク0561 " "カワサキシ アサオク フルサワ 172-1 " "GF4C001 " "000001" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000129" "132" "20230401" "202305082041" "110" "売上" "11JB" "300001369" "川崎北支店" "" "200000007" "アルフレッサ株式会社" "0287503000" "670237078008644636" "株式会社キリン堂 一貫堂薬局" "カブシキガイシャキリンドウ イッカンドウヤッキョク" "215-0026 神奈川県川崎市麻生区古沢172−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "1" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "J2023040300000130" "132" "" "" "110" "" "" "300001369" "" "" "200000007" "" "" "" "" "" "" "" "" "" "" "" "1" "0" "0" "J" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "23-04-03 20:42:11" "" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "0287503000" "496300127" "111" "230401" "20230401" "6523689" "ゴナ-ルエフヒカチユウペン450 1トウ " "イツカンドウヤツキヨク0561 " "カワサキシ アサオク フルサワ 172-1 " "GF4C001 " "000001" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000131" "132" "20230401" "202305082041" "110" "売上" "11JB" "300001369" "川崎北支店" "" "200000007" "アルフレッサ株式会社" "0287503000" "670237078008644636" "株式会社キリン堂 一貫堂薬局" "カブシキガイシャキリンドウ イッカンドウヤッキョク" "215-0026 神奈川県川崎市麻生区古沢172−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "1" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv new file mode 100644 index 00000000..48cb064b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D4529602K1201130032696508657140002304016527757111 496300110ゴナ-ルエフヒカチユウペン300 1トウ モリノクスリヤヤツキヨク オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 GF3B013 000005 000000 000000 " "296" "02" "K12011300326965" "0865714000" "496300110" "111" "230401" "20230401" "6527757" "ゴナ-ルエフヒカチユウペン300 1トウ " "モリノクスリヤヤツキヨク " "オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 " "GF3B013 " "000005" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000130" "133" "20230401" "202305082041" "110" "売上" "K120" "300006583" "沖縄第二営業部" "200000007" "アルフレッサ株式会社" "0865714000" "670232348519842842" "有限会社吾妻サンライズ 森の薬屋薬局" "ユウゲンガイシャアガツマサンライズ モリノクスリヤヤッキョク" "901-0406 沖縄県島尻郡八重瀬町屋宜原238−1" "496300110" "ゴナールエフ 皮下注ペン 300IU 1PEN" "1" "5" "0" "0" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "0" "23-04-03 20:42:11" "system" +"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "J2023040300000131" "132" "" "" "110" "" "" "300001369" "" "" "200000007" "" "" "" "" "" "" "" "" "" "" "" "1" "0" "0" "J" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "23-04-03 20:42:11" "" +"D4529602K1201130032696508657140002304016527757111 496300110ゴナ-ルエフヒカチユウペン300 1トウ モリノクスリヤヤツキヨク オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 GF3B013 000005 000000 000000 " "296" "02" "K12011300326965" "0865714000" "496300110" "111" "230401" "20230401" "6527757" "ゴナ-ルエフヒカチユウペン300 1トウ " "モリノクスリヤヤツキヨク " "オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 " "GF3B013 " "000005" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000132" "133" "20230401" "202305082041" "110" "売上" "K120" "300006583" "沖縄第二営業部" "200000007" "アルフレッサ株式会社" "0865714000" "670232348519842842" "有限会社吾妻サンライズ 森の薬屋薬局" "ユウゲンガイシャアガツマサンライズ モリノクスリヤヤッキョク" "901-0406 沖縄県島尻郡八重瀬町屋宜原238−1" "496300110" "ゴナールエフ 皮下注ペン 300IU 1PEN" "1" "5" "0" "0" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "0" "23-04-03 20:42:11" "system" +"D4529602K1201130032696508657140002304016527757111 496300127ゴナ-ルエフヒカチユウペン450 1トウ モリノクスリヤヤツキヨク オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 GF4B011 000010 000000 000000 " "296" "02" "K12011300326965" "0865714000" "496300127" "111" "230401" "20230401" "6527757" "ゴナ-ルエフヒカチユウペン450 1トウ " "モリノクスリヤヤツキヨク " "オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 " "GF4B011 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000133" "134" "20230401" "202305082041" "110" "売上" "K120" "300006583" "沖縄第二営業部" "200000007" "アルフレッサ株式会社" "0865714000" "670232348519842842" "有限会社吾妻サンライズ 森の薬屋薬局" "ユウゲンガイシャアガツマサンライズ モリノクスリヤヤッキョク" "901-0406 沖縄県島尻郡八重瀬町屋宜原238−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "1" "10" "0" "0" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "0" "23-04-03 20:42:11" "system" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv new file mode 100644 index 00000000..0d97de4d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229430760653825" "0" "20000101" "99991231" "" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "" "0" "700-0023 岡山県岡山市北区駅前町1−6−20" "オカヤマケン オカヤマシキタク エキマエチョウ1-6-20" "700-0023" "33" "岡山県" "岡山市北区" "駅前町1−6−20" "0862236468" "33101" "30" "1" "2023-09-29 09:43:55" "2023-09-29 09:48:44" +"670229435466662922" "0" "20000101" "99991231" "" "医療法人社団仁卓会 ほりかわ歯科クリニック" "イリョウホウジンシャダンジンタクカイ ホリカワシカクリニック" "ほりかわ歯科クリニック (医社)" "ホリカワシカクリニック (イシャ)" "" "0" "675-0101 兵庫県加古川市平岡町新在家1573−1−4F" "ヒョウゴケン カコガワシ ヒラオカチョウシンザイケ1573-1-4F" "675-0101" "28" "兵庫県" "加古川市" "平岡町新在家1573−1−4F" "0794244617" "28210" "30" "1" "" "" +"670229435785430019" "0" "20000101" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206529" "0" "20000101" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県姫路市安田4−47−8−1F" "ヒョウゴケン ヒメジシ ヤスダ4-47-8-1F" "670-0955" "28" "兵庫県" "姫路市" "安田4−47−8−1F" "0792846396" "28201" "20" "1" "" "" +"670229447437206530" "0" "20000101" "20230407" "" "" "" "" "" "" "0" "" "" "" "" "" "" "" "" "" "1" "" "" +"670229447437206531" "0" "20000101" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県姫路市安田4−47−8−1F" "ヒョウゴケン ヒメジシ ヤスダ4-47-8-1F" "670-0955" "28" "兵庫県" "姫路市" "安田4−47−8−1F" "0792846396" "28201" "20" "1" "" "" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv new file mode 100644 index 00000000..2cc40cb0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229447437206530" "0" "20000202" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206531" "0" "20000101" "20230407" "" "" "" "" "" "" "0" "" "" "" "" "" "" "" "" "" "1" "" "" +"670229463350395910" "0" "20000101" "99991231" "" "こうだ歯科" "コウダシカ" "こうだ歯科" "コウダシカ" "" "0" "770-0831 徳島県徳島市寺島本町西1−10" "トクシマケン トクシマシ テラシマホンチョウニシ1-10" "770-0831" "36" "徳島県" "徳島市" "寺島本町西1−10" "0886552625" "36201" "30" "1" "" "" +"670229489380246545" "0" "20020521" "99991231" "" "社会医療法人社団埼玉巨樹の会 狭山中央病院" "シャカイイリョウホウジンシャダンサイタマキョジュノカイ サヤマチュウオウビョウイン" "狭山中央病院 (社社)" "サヤマチュウオウビョウイン (シャシャ)" "" "0" "350-1306 埼玉県狭山市富士見2−19−35" "サイタマケン サヤマシ フジミ2-19-35" "350-1306" "11" "埼玉県" "狭山市" "富士見2−19−35" "0429597111" "11215" "10" "1" "" "" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv new file mode 100644 index 00000000..9199fc0b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "卸ホールディングス名01-1" "オロシホールディングスメイ01-1" "卸名01-1" "20230101" "99991231" "1" "0" "23-05-09 12:00:01" "23-05-09 13:00:01" +"10001" "2" "卸ホールディングス名01-2" "オロシホールディングスメイ01-2" "卸名01-2" "20230102" "99991231" "1" "0" "23-05-09 12:00:02" "23-05-09 13:00:02" +"10001" "3" "卸ホールディングス名01-3" "オロシホールディングスメイ01-3" "卸名01-3" "20230103" "99991231" "1" "0" "23-05-09 12:00:03" "23-05-09 13:00:03" +"10001" "4" "卸ホールディングス名01-4" "オロシホールディングスメイ01-4" "卸名01-4" "20230104" "99991231" "1" "0" "23-05-09 12:00:04" "23-05-09 13:00:04" +"10001" "5" "卸ホールディングス名01-5" "" "" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" +"10001" "6" "卸ホールディングス名01-6" "オロシホールディングスメイ01-6" "卸名01-6" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv new file mode 100644 index 00000000..c5f81610 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "5" "卸ホールディングス名01-5" "オロシホールディングスメイ01-5" "卸名01-5" "20230103" "99991231" "1" "0" "23-05-09 12:00:05" "23-05-09 13:00:05" +"10001" "6" "卸ホールディングス名01-6" "" "" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" +"10002" "1" "卸ホールディングス名02-1" "オロシホールディングスメイ02-1" "卸名02-1" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" +"10002" "2" "卸ホールディングス名02-2" "オロシホールディングスメイ02-2" "卸名02-2" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv new file mode 100644 index 00000000..627d7b66 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA001" "20230331" "20210510" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA002" "20230331" "20210615" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA003" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA004" "20231031" "20210823" "23-05-08 20:40:41" "batch" +"F0110602" "BAVA001" "20231031" "20210823" "23-05-08 20:40:41" "" +"F0110602" "BAVA002" "20231031" "20210823" "23-05-08 20:40:41" "batch" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv new file mode 100644 index 00000000..da441c96 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA005" "20231031" "20210927" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA006" "20240131" "20211025" "23-05-08 20:40:41" "batch" +"F0110602" "BAVA001" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110602" "BAVA002" "20231031" "20210823" "23-05-08 20:40:41" "" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv new file mode 100644 index 00000000..f27cf3ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229780011959315" "1" "003410424" "0" "20020601" "0" "22-03-09 13:56:19" "22-03-09 13:56:19" +"670230081112654862" "0" "004101420" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:17:34" +"670230081112654862" "1" "004104997" "2" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "3" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:13:49" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv new file mode 100644 index 00000000..fe0ab79c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670230081112654862" "1" "004104997" "0" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:13:49" +"670230100414841865" "1" "003636480" "0" "20000101" "0" "22-03-09 14:13:49" "22-03-09 14:13:49" +"670230330673742853" "0" "004804003" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 15:20:35" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv new file mode 100644 index 00000000..a782e200 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv @@ -0,0 +1,7 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"3" "300003202" "その他営業本部卸" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003138" "北関東甲信越営業本部" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"a" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタッフ医療3" "3" "d" "300003204" "東海スタッフ医療4" "4" "e" "300003205" "東海スタッフ医療5" "5" "f" "300003206" "東海スタッフ医療6" "6" "g" "300003207" "東海スタッフ医療7" "7" "h" "300003208" "東海スタッフ医療8" "8" "i" "300003209" "東海スタッフ医療9" "9" "j" "300003210" "東海スタッフ医療10" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"1" "300003144" "" "1" "2" "300003202" "" "2" "c" "300003203" "" "3" "d" "300003204" "" "4" "e" "300003205" "" "5" "f" "300003206" "" "6" "g" "300003207" "" "7" "h" "300003208" "" "8" "i" "300003209" "" "9" "j" "300003210" "" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"2" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタッフ医療3" "3" "d" "300003204" "東海スタッフ医療4" "4" "e" "300003205" "東海スタッフ医療5" "5" "f" "300003206" "東海スタッフ医療6" "6" "g" "300003207" "東海スタッフ医療7" "7" "h" "300003208" "東海スタッフ医療8" "8" "i" "300003209" "東海スタッフ医療9" "9" "j" "300003210" "東海スタッフ医療10" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv new file mode 100644 index 00000000..7482316d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv @@ -0,0 +1,5 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"1" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタッフ医療3" "3" "d" "300003204" "東海スタッフ医療4" "4" "e" "300003205" "東海スタッフ医療5" "5" "f" "300003206" "東海スタッフ医療6" "6" "g" "300003207" "東海スタッフ医療7" "7" "h" "300003208" "東海スタッフ医療8" "8" "i" "300003209" "東海スタッフ医療9" "9" "j" "300003210" "東海スタッフ医療10" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"2" "300003144" "" "1" "2" "300003202" "" "2" "c" "300003203" "" "3" "d" "300003204" "" "4" "e" "300003205" "" "5" "f" "300003206" "" "6" "g" "300003207" "" "7" "h" "300003208" "" "8" "i" "300003209" "" "9" "j" "300003210" "" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003144" "メディカル営業本部" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv new file mode 100644 index 00000000..208d1a20 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"042" "01" "361007" "0" "300006657" "20230401" "99991231" "0" "0" "23-04-12 11:24:06" "23-04-12 11:24:06" +"042" "01" "381207" "0" "300006658" "20230401" "99991231" "0" "0" "23-04-12 11:24:27" "23-04-12 11:24:27" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" "20230331" "0" "0" "23-04-12 10:46:48" "23-04-12 10:46:48" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv new file mode 100644 index 00000000..c91eafee --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" "20230331" "0" "0" "23-04-12 10:46:48" "23-04-12 10:46:48" +"080" "00" "21807" "2" "300006649" "20230401" "99991231" "0" "0" "23-04-12 10:49:23" "23-04-12 10:49:23" +"080" "00" "25110" "0" "300005251" "20000101" "99991231" "0" "9" "21-03-11 14:59:47" "23-04-12 10:47:42" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv new file mode 100644 index 00000000..98d9ba16 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496201110" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20080101" "20190930" "140" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496201127" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20070401" "20190930" "150" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496300110" "2" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "F1990608" "ゴナールエフ皮下注ペン 300" "GONAL-F PEN 300IU (1) - JPN" "005" "セロスティム" "ST" "F005" "皮下注ペン" "0000" "" "V017" "300IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "100" "9" "19-04-23 16:35:36" "19-04-23 16:40:38" +"496300127" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" +"496300128" "1" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" +"496300128" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv new file mode 100644 index 00000000..8656b6c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496300128" "1" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" +"496300128" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" +"496300134" "2" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "F19B0608" "ゴナールエフ皮下注ペン900" "Gonalef Pen 900 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V019" "900IU" "P011" "1PEN" "1" "20230603" "0" "0" "20190501" "20190930" "110" "9" "19-04-23 16:38:36" "19-04-23 16:41:05" +"496301315" "0" "プロファシー 注射剤 5000IU 10VIAL" "" "F47706A0" "プロファシー 注 5000IU" "PROFASI M AMP. 5000 IU (10)" "002" "プロファシー" "PF" "F002" "注射剤" "0000" "" "V020" "5000IU" "P005" "10VIAL" "10" "20230604" "0" "0" "20070401" "20190930" "160" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv new file mode 100644 index 00000000..b47ae0e6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"114430502" "01" "2" "10060.2" "20180401" "20190930" "10" "0" "18-03-07 09:33:37" "19-09-19 11:23:47" +"114430502" "01" "3" "10237.2" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" +"114430502" "03" "2" "100602" "20180401" "20190930" "30" "0" "18-03-07 09:39:48" "19-09-19 11:23:47" +"114430502" "03" "3" "102372" "20191001" "99991231" "30" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv new file mode 100644 index 00000000..c5331854 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"114430502" "03" "2" "100602" "20180401" "20190930" "30" "0" "18-03-07 09:39:48" "19-09-19 11:23:47" +"114430502" "03" "3" "102372" "20191001" "99991231" "30" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" +"114430601" "01" "2" "12362.4" "20180401" "20190930" "10" "0" "18-03-07 09:48:00" "19-09-19 11:23:47" +"114430601" "01" "3" "12587.8" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv new file mode 100644 index 00000000..41bcc129 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv @@ -0,0 +1,7 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D4420202011611A4 0183733 23030133625911102303 4963500230000020003110000000622000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362591" "000002" "00031100" "0000062200" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000022" "29" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "2" "31100" "62200" "31438" "62876" "35309" "70618" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4420202011611A4 0183733 23030133625921102303 4963500230000080003110000002488000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362592" "000008" "00031100" "0000248800" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000023" "30" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "31100" "248800" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000011" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173720211122303 4963500230000080002738100002190480000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7372021" "000008" "00027381" "0000219048" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000012" "17" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "J2023022400000013" "18" "110" "" "110" "" "" "300000391" "200000007" "" "200000015" "" "" "" "" "" "" "" "" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "" "" "" "" "J" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "23-04-03 20:42:11" "" +"D4416101311101A8 5140013 23030173720211122303 4963500230000080002738100002190480000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7372021" "000008" "00027381" "0000219048" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000014" "19" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv new file mode 100644 index 00000000..beba523c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"DAY2-101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000013" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "J2023022400000014" "18" "110" "" "110" "" "" "300000391" "200000007" "" "200000015" "" "" "" "" "" "" "" "" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "" "" "" "" "J" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "23-04-03 20:42:11" "" +"DAY2-202041131A1 1409581 23030106357711102303 4963500230000070002966000002076200000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトウホクロウサイビヨウイン 00009818563センダイシアオバクダイノハラ " "202" "02" "041131A1 " "1409581 " "496350023" "110" "230301" "20230301" "0635771" "000007" "00029660" "0000207620" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トウホクロウサイビヨウイン " "9818563センダイシアオバクダイノハラ " "センダイシアオバクダイノハラ " "9818563" "" "000000" " " "20230227" "J" "VJSK_J_MERCK_2023022" "J2023022700000128" "135" "20230301" "202303142041" "110" "売上" "04113" "300000354" "北仙台支店" "" "200000016" "株式会社スズケン" "1409581 " "670232828063007745" "ドクリツギョウセイホウジンロウドウシャケンコウアンゼンキコウ トウホクロウサイビョウイン" "独立行政法人労働者健康安全機構 東北労災病院" "981-0911 宮城県仙台市青葉区台原4−3−21" "496350023" "アービタックス 注射剤 100mg 1VIAL" "7" "29660" "207620" "31438" "220066" "35309" "247163" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"DAY2-202141234B1 2607506 23030109289511102303 4963500230000100003036600003036600000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vヨコスカキヨウサイビヨウイン 00002380011カナガワケンヨコスカシヨネガハマドオリ1-16 " "202" "02" "141234B1 " "2607506 " "496350023" "110" "230301" "20230301" "0928951" "000010" "00030366" "0000303660" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ヨコスカキヨウサイビヨウイン " "2380011カナガワケンヨコスカシヨネガハマドオリ1-16 " "カナガワケンヨコスカシヨネガハマドオリ1-16 " "2380011" "" "000000" " " "20230228" "J" "VJSK_J_MERCK_2023022" "J2023022800000094" "101" "20230301" "202303142041" "110" "売上" "14123" "300000274" "磯子支店" "" "200000016" "株式会社スズケン" "2607506 " "670236609488110605" "コッカコウムインキョウサイクミアイレンゴウカイ ヨコスカキョウサイビョウイン" "国家公務員共済組合連合会 横須賀共済病院" "238-0011 神奈川県横須賀市米が浜通1−16" "496350023" "アービタックス 注射剤 100mg 1VIAL" "10" "30366" "303660" "31438" "314380" "35309" "353090" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv new file mode 100644 index 00000000..4c4d9c43 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv @@ -0,0 +1,7 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"D463630101 23022849630021900003500000 セトロタイドチユウシヤヨウ0.25MG 1V" "363" "01" "01 " "230228" "496300219" "000035" "0" "0000" " セトロタイドチユウシヤヨウ0.25MG 1V" "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000059" "59" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001270000040000001ゴナールエフヒカチユウペン450 1トウ40 " "253" "01" "026 " "230228" "496300127" "000004" "0" "0000" "01ゴナールエフヒカチユウペン450 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000060" "60" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000061" "61" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "253" "01" "026 " "230228" "496300417" "000050" "0" "0000" "01オビドレルヒカチユウシリンジ250MCG 140 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000062" "62" "202303142041" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "23-03-14 20:41:57" "SYSTEM" +"" "" "" "" "" "" "" "" "" "" "" "" "" "J2023031400000063" "63" "" "" "" "" "" "" "" "" "" "" "" "" "23-03-14 20:41:57" "" +"D4625301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "253" "01" "026 " "230228" "496300417" "000050" "0" "0000" "01オビドレルヒカチユウシリンジ250MCG 140 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000064" "64" "202303142041" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "23-03-14 20:41:57" "SYSTEM" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv new file mode 100644 index 00000000..bd43cb40 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"DAY2-301027 2302284963001100000020000001ゴナールエフヒカチユウペン300 1トウ40 " "253" "01" "027 " "230228" "496300110" "000002" "0" "0000" "01ゴナールエフヒカチユウペン300 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000063" "63" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"" "" "" "" "" "" "" "" "" "" "" "" "" "J2023031400000064" "64" "" "" "" "" "" "" "" "" "" "" "" "" "23-03-14 20:41:57" "" +"DAY2-301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000065" "65" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"DAY2-301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "253" "01" "026 " "230228" "496300417" "000050" "0" "0000" "01オビドレルヒカチユウシリンジ250MCG 140 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000066" "66" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv new file mode 100644 index 00000000..ee01c830 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "Veeva取引区分名01-1" "20230101" "99991231" "1" "0" "2023-05-09 12:00:01" "2023-05-09 13:00:01" +"10001" "2" "Veeva取引区分名01-2" "20230102" "99991231" "1" "0" "2023-05-09 12:00:02" "2023-05-09 13:00:02" +"10001" "3" "Veeva取引区分名01-3" "20230103" "99991231" "1" "0" "2023-05-09 12:00:03" "2023-05-09 13:00:03" +"10001" "4" "Veeva取引区分名01-4" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" +"10001" "5" "" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" +"10001" "6" "Veeva取引区分名01-6" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv new file mode 100644 index 00000000..a62dd170 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "5" "Veeva取引区分名01-5" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" +"10001" "6" "" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" +"10002" "1" "Veeva取引区分名0-1" "20230203" "20301231" "1" "0" "2023-05-09 12:00:05" "2023-05-09 13:00:05" +"10002" "2" "Veeva取引区分名02-2" "20230204" "20301231" "1" "0" "2023-05-09 12:00:06" "2023-05-09 13:00:06" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv new file mode 100644 index 00000000..dca02347 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000001" "900000001" "20230509" "事由01" +"100000002" "900000002" "20230509" "事由02" +"100000003" "900000003" "20230509" "事由03" +"100000004" "900000004" "20230509" "事由04" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv new file mode 100644 index 00000000..c99d9f76 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000003" "900000003" "20230509" "DAY-2事由03" +"100000004" "900000004" "20230509" "DAY-2事由04" +"100000005" "900000005" "20230509" "DAY-2事由05" +"100000006" "900000006" "20230509" "DAY-2事由06" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv new file mode 100644 index 00000000..5e0410dc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1002900000" "0" "20000101" "99991231" "11" "1131A2283316" "辻内科小児科医院               " "ツジナイカシヨウニカ イイン" "長崎県 佐世保市皆瀬町29                   " "ナガサキケン サセボシカイゼチヨウ 29" "8570144" "0956492319" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1005400000" "0" "20000101" "99991231" "12" "1211C3415515" "医療法人 愛恵会 佐世保愛恵病院       " "イリヨウホウジンアイケイカイサセボアイケイビ" "長崎県 佐世保市瀬戸越4丁目 2−15             " "ナガサキケン サセボシセトゴシ 4チヨウメ 2-15" "8570134" "0956493335" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007200000" "0" "20000101" "99991231" "11" "1131A2407312" "医療法人 山祇診療所             " "イリヨウホウジンヤマズミシンリヨウジヨ" "長崎県 佐世保市山祇町 19−36               " "ナガサキケン サセボシヤマズミチョウ" "8570822" "0956313633" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007800000" "0" "20000101" "99991231" "11" "1121A2402213" "医療法人道仁会 品川医院           " "イリヨウホウジンドウジンカイ シナガワイイン" "長崎県 佐世保市柚木町2188                 " "ナガサキケン サセボシユノキチヨウ 2188" "8570112" "0956460005" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009200000" "0" "20000101" "99991231" "" "" "" "" "" "" "" "" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009300000" "0" "20000101" "99991231" "11" "1121A2224212" "山口医院2                  " "ヤマグチイイン" "長崎県 佐世保市春日町29−14                " "ナガサキケン サセボシカスガチヨウ29-14" "8570011" "0956228610" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv new file mode 100644 index 00000000..e31cf296 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1008000000" "0" "20000101" "99991231" "11" "1131A2283316" "北原整形外科医院2              " "キタハラセイケイゲカ イイン" "長崎県 佐世保市瀬戸越町4丁目1298−1           " "ナガサキケン サセボシセトゴシチヨウ 1298-1" "8570135" "0956497773" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009100000" "0" "20000101" "99991231" "11" "1121A2224212" "山口医院2                  " "ヤマグチイイン" "長崎県 佐世保市春日町29−14                " "ナガサキケン サセボシカスガチヨウ29-14" "8570011" "0956228610" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009200000" "0" "20000101" "99991231" "11" "1121A2224212" "山口医院2                  " "ヤマグチイイン" "長崎県 佐世保市春日町29−14                " "ナガサキケン サセボシカスガチヨウ29-14" "8570011" "0956228610" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009300000" "0" "20000101" "99991231" "" "" "" "" "" "" "" "" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv new file mode 100644 index 00000000..d4a060b7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv @@ -0,0 +1,7 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000002" "0" "株式会社モロオ" "カナ01" "モロオ" "1110001" "住所01" "ジュウショ01" "00-0000-0001" "0" "20000101" "99991231" "20" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000005" "0" "岩渕薬品株式会社" "カナ02" "岩渕薬品" "1110002" "住所02" "ジュウショ02" "00-0000-0002" "0" "20000101" "99991231" "50" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000009" "0" "株式会社マルタケ" "カナ03" "マルタケ" "1110003" "住所03" "ジュウショ03" "00-0000-0003" "0" "20000101" "99991231" "90" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000010" "0" "株式会社ファイネス" "カナ04" "ファイネス" "1110004" "住所04" "ジュウショ04" "00-0000-0004" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000011" "0" "鍋林株式会社" "" "" "" "" "" "" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000012" "0" "岡野薬品株式会社" "カナ06" "岡野薬品" "1110004" "住所04" "ジュウショ04" "00-0000-0004" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv new file mode 100644 index 00000000..01e5ba6b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000011" "0" "鍋林株式会社" "カナ05" "鍋林" "1110004" "住所04" "ジュウショ04" "00-0000-0004" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000012" "0" "岡野薬品株式会社" "" "" "" "" "" "" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000013" "0" "株式会社アスティス" "" "アスティス" "" "" "" "" "0" "20000101" "99991231" "110" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000014" "0" "株式会社スズケン岩手" "" "スズケン岩手" "" "" "" "" "0" "20000101" "99991231" "120" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py new file mode 100644 index 00000000..a03a8638 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -0,0 +1,11 @@ +"""共通テストフィクスチャ""" + +import pytest + +from src.db.database import Database + + +@pytest.fixture +def database() -> Database: + """データベース接続モジュールを作成""" + return Database.get_instance() diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py new file mode 100644 index 00000000..a59a647b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -0,0 +1,171 @@ +import csv +import os +import tempfile +from datetime import datetime + +from src.batch.ultmarc.datfile import DatFile, DatFileLine +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ + UltmarcTableMapperFactory +from src.db.database import Database + + +def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: + """ファイルから、アルトマーク取り込み用のテストデータを作成する + + Args: + file_path (str): csvファイルのパス + + Returns: + DatFile: データファイルオブジェクト + """ + + # 一度、Shift-JISファイルで書き出す + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932', delete=False) as tmp_file: + tmp_file.write(csv_file.read()) + tmp_file.seek(0) + tmpfile_path = tmp_file.name + + dat_file = DatFile.from_path(tmpfile_path) + os.unlink(tmpfile_path) + return dat_file + + +def create_db_data_from_csv(file_path: str) -> list[dict]: + """ファイルから、DBの期待値データを作成する + + Args: + file_path (str): csvファイルのパス + + Returns: + DatFile: データファイルオブジェクト + """ + + with open(file_path, encoding='utf8') as csv_file: + # ヘッダ行を取得し、改行とクォートを取り除く。 + header = csv_file.readline().strip('\n').replace('"', '').split(',') + reader = csv.DictReader(csv_file, fieldnames=header) + rows = [r for r in reader] + + # データ型変換 + for row in rows: + for k, v in row.items(): + converted_value = v + if v == 'NULL': + converted_value = None + if is_valid_date_format(v, '%Y/%m/%d') is True: # YYYY/MM/DD + converted_value = datetime.strptime(v, '%Y/%m/%d').date() + if is_valid_date_format(v, '%Y-%m-%d') is True: # YYYY-MM-DD + converted_value = datetime.strptime(v, '%Y-%m-%d').date() + if is_valid_date_format(v, '%Y/%m/%d %H:%M:%S') is True: # YYYY/MM/DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y/%m/%d %H:%M:%S') + if is_valid_date_format(v, '%Y-%m-%d %H:%M:%S') is True: # YYYY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y-%m-%d %H:%M:%S') + + row[k] = converted_value + + return rows + + +def create_insert_sql_with_parameter(table_name: str, column_names: list[str], test_data: list[str]) -> tuple[str, dict]: + """INSERT文と登録値のパラメータを返す + + Args: + table_name (str): スキーマ完全修飾のテーブル名(例:src05.com_alma) + column_names (list[str]): カラム名のリスト + test_data (list[str]): 値のリスト + + Returns: + tuple[str, dict]: [0]→INSERT文,[1]→値のパラメータ + """ + placeholders = ','.join([f':{column_name}' for column_name in column_names]) + insert_sql = f"INSERT INTO {table_name} ({','.join(column_names)}) VALUES({placeholders})" + parameter = {k: v for k, v in zip(column_names, test_data)} + + return insert_sql, parameter + + +def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str, str]): + """DELETE文と削除条件値のパラメータを返す + + Args: + table_name (str): スキーマ完全修飾のテーブル名(例:src05.com_alma) + delete_parameter (dict[str, str]): 削除条件に使用するカラム名と値の辞書 + + Returns: + tuple[str, dict]: [0]→DELETE文,[1]→値のパラメータ + """ + where_clause_list = [] + for k in delete_parameter: + where_clause_list.append(f'{k} = :{k}') + where_clauses = ' AND '.join(where_clause_list) + delete_sql = f"DELETE FROM {table_name} WHERE {where_clauses}" + + return delete_sql, delete_parameter + + +def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcTableMapper: + """アルトマークテーブルマッパーのインスタンスを返す + + Args: + line (DatFileLine): テストデータの1行 + db (Database): 接続済みDBインスタンス + + Returns: + UltmarcTableMapper: マッパークラス + """ + layout_class = line.layout_class + factory = UltmarcTableMapperFactory() + sut = factory.create( + layout_class=layout_class, + records=line.records, + db=db + ) + + return sut + + +def is_valid_date_format(date_str: str, date_format): + """日付文字列が、与えられたフォーマットにマッチするかを検査する + + Args: + date_str (str): 日付文字列 + date_format (str, optional): 日付のフォーマット + + Returns: + _type_: 正しい日付文字列の場合、True、それ以外はFalse + """ + if date_str is None: + return False + try: + datetime.strptime(date_str, date_format) + return True + except ValueError: + return False + + +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_name: list = None) -> None: + """テーブル同士の取得結果突き合わせ + + Args: + actual_rows (list[dict]): テスト結果の辞書リスト + expect_rows (list[dict]): 期待値の辞書リスト + ignore_col_name (list): 比較を無視するDBのカラム名. Default None. + """ + # 取得件数が一致すること + assert len(actual_rows) == len(expect_rows) + + line_number = 0 + # 1行ずつ調査 + for actual_row, expect_row in zip(actual_rows, expect_rows): + line_number += 1 + # 1カラムずつ調査 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + # テストメソッド側で個別に確認するものはスキップさせる + if ignore_col_name is not None and actual_col_name in ignore_col_name: + continue + else: + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + assert actual_value == expect_value, f'{line_number}行目:{actual_col_name}が、期待値と一致すること' diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py new file mode 100644 index 00000000..dbbeb1c2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -0,0 +1,128 @@ + + +import csv +import decimal +from datetime import datetime + + +def create_vjsk_assertion_list(file_path: str) -> list: + """DB登録期待値リストを作成する + + Args: + file_path (str): DB登録期待値ファイル(tsvファイル)のパス + ※DB登録期待値ファイルの前提 + 受領データファイルと同じ + BOM付きtsv形式 + 一行目はカラム名になっているヘッダ行 + + Returns: + List(dict) DB登録期待値辞書リスト + """ + with open(file_path, encoding='utf_8_sig', newline='') as tsv_file: + header = tsv_file.readline().strip('\n').replace('"', '').split('\t') + reader = csv.DictReader(tsv_file, fieldnames=header, delimiter='\t') + rows = [r for r in reader] + + # DB抽出値と比較できるように、リテラル値をDB抽出値と同じデータフォーマットに変換 + for row in rows: + for k, v in row.items(): + converted_value = v + if v == 'NULL': + converted_value = None + if is_valid_date_format(v, '%Y/%m/%d') is True: # YYYY/MM/DD + converted_value = datetime.strptime(v, '%Y/%m/%d').date() + if is_valid_date_format(v, '%Y-%m-%d') is True: # YYYY-MM-DD + converted_value = datetime.strptime(v, '%Y-%m-%d').date() + if is_valid_date_format(v, '%Y/%m/%d %H:%M:%S') is True: # YYYY/MM/DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y/%m/%d %H:%M:%S') + if is_valid_date_format(v, '%Y-%m-%d %H:%M:%S') is True: # YYYY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y-%m-%d %H:%M:%S') + if is_valid_date_format(v, '%y-%m-%d %H:%M:%S') is True: # YY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%y-%m-%d %H:%M:%S') + + row[k] = converted_value + + return rows + + +def is_valid_date_format(date_str: str, date_format): + """日付文字列が、与えられたフォーマットにマッチするかを検査する + + Args: + date_str (str): 日付文字列 + date_format (str, optional): 日付のフォーマット + + Returns: + _type_: 正しい日付文字列の場合、True、それ以外はFalse + """ + try: + datetime.strptime(date_str, date_format) + return True + except ValueError: + return False + + +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_names: list = None, force_cast_to_str_columns: list = None, is_loaddata=False) -> None: + """テーブル同士の取得結果突き合わせ + + Args: + actual_rows (list[dict]): テスト結果の辞書リスト + expect_rows (list[dict]): 期待値の辞書リスト + ignore_col_name (list): 比較を無視するDBのカラム名. Default None. + force_cast_to_str_columns (list): 強制的に文字列にキャストする項目のリスト + is_loaddata (bool): LOAD DATAで読み込むテーブルかどうかのフラグ。org05の比較をするときにONにする. Default False. + """ + # 取得件数が一致すること + assert len(actual_rows) == len(expect_rows), f'レコード件数が一致しません。DBレコード数 : {len(actual_rows)} 期待値 : {len(expect_rows)}' + + line_number = 0 + # 1行ずつ調査 + for actual_row, expect_row in zip(actual_rows, expect_rows): + line_number += 1 + # 1カラムずつ調査 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + # テストメソッド側で個別に確認するものはスキップさせる + if ignore_col_names is not None and actual_col_name in ignore_col_names: + continue + else: + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + + # 期待値を、DBのデータ型(リフレクションされたpythonのデータ型)にキャストする + if force_cast_to_str_columns is not None and actual_col_name in force_cast_to_str_columns: + # DB項目(varchar)に日付型としてキャスト可能な値が期待値である場合、force_cast_to_str_columnsに基づいて強制的に文字列キャストする + if type(expect_value).__name__ == 'date': + expect_value = expect_value.strftime('%Y-%m-%d') + elif type(expect_value).__name__ == 'datetime': + expect_value = expect_value.strftime('%Y-%m-%d %H:%M:%S') + elif not is_loaddata and expect_value == "": + expect_value = None + elif isinstance(actual_value, (int)): + # DB項目(int)の場合、期待値もintにキャストする + expect_value = int(expect_value) + elif isinstance(actual_value, (float)): + # DB項目(float)の場合、期待値もfloatにキャストする + expect_value = float(expect_value) + elif isinstance(actual_value, (decimal.Decimal)): + # DB項目(decimal)の場合、期待値もdecimalにキャストする + expect_value = decimal.Decimal(expect_value) + elif type(actual_value).__name__ == "date": + # DB項目(date)の場合、期待値("YYYYMMDD")もdateにキャストする + if is_valid_date_format(expect_value, '%Y%m%d') is True: # YYYYMMDD + expect_value = datetime.strptime(expect_value, '%Y%m%d').date() + elif actual_value is None and expect_value == "": + # DB項目値がNULLの場合、期待値が""であればNoneに置換する + expect_value = None + elif actual_value == "0000-00-00" and expect_value == "": + # DB項目(date)がゼロ日付(NULL代替値)の場合、期待値が""であれば"0000-00-00"に置換する + expect_value = "0000-00-00" + elif actual_value == "0000-00-00 00:00:00" and expect_value == "": + # DB項目(datetime)がゼロ日付(NULL代替値)の場合、期待値が""であれば"0000-00-00 00:00:00"に置換する + expect_value = "0000-00-00 00:00:00" + elif actual_value == "" and expect_value == "" and not is_loaddata: + # DB項目値が空文字のかつ期待値が""のパターンは想定外のパターンであるため、期待値をNoneに置換して失敗させる + # LOAD文では空文字で登録されるので除外する + expect_value = None + + # 検証 + assert actual_value == expect_value, f'{line_number}行目:"{actual_col_name}" : "{actual_value}" ({type(actual_value)})が、期待値 "{expect_value}" ({type(expect_value)}) と一致しませんでした' diff --git a/ecs/jskult-batch-laundering/.dockerignore b/ecs/jskult-batch-laundering/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-batch-laundering/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-batch-laundering/.env.example b/ecs/jskult-batch-laundering/.env.example new file mode 100644 index 00000000..055fde91 --- /dev/null +++ b/ecs/jskult-batch-laundering/.env.example @@ -0,0 +1,16 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +LOG_LEVEL=INFO +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ + +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=7 +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME=sales_lau_all diff --git a/ecs/jskult-batch-laundering/.gitignore b/ecs/jskult-batch-laundering/.gitignore new file mode 100644 index 00000000..bd0b37f8 --- /dev/null +++ b/ecs/jskult-batch-laundering/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-batch-laundering/.vscode/launch.json b/ecs/jskult-batch-laundering/.vscode/launch.json new file mode 100644 index 00000000..ac80ce4f --- /dev/null +++ b/ecs/jskult-batch-laundering/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG)jskult batch laundering", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-batch-laundering/.vscode/recommended_settings.json b/ecs/jskult-batch-laundering/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-batch-laundering/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-batch-laundering/Dockerfile b/ecs/jskult-batch-laundering/Dockerfile new file mode 100644 index 00000000..dd891d48 --- /dev/null +++ b/ecs/jskult-batch-laundering/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-batch-laundering/Pipfile b/ecs/jskult-batch-laundering/Pipfile new file mode 100644 index 00000000..65b30a51 --- /dev/null +++ b/ecs/jskult-batch-laundering/Pipfile @@ -0,0 +1,19 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-batch-laundering/Pipfile.lock b/ecs/jskult-batch-laundering/Pipfile.lock new file mode 100644 index 00000000..cb296143 --- /dev/null +++ b/ecs/jskult-batch-laundering/Pipfile.lock @@ -0,0 +1,218 @@ +{ + "_meta": { + "hash": { + "sha256": "e2e2efd7ebd6ad719931983f277105dd94c4ebb6363f7c00e75dd8ca05523713" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "greenlet": { + "hashes": [ + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.3" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.1.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.0.28" + }, + "tenacity": { + "hashes": [ + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==8.2.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" + ], + "markers": "python_version >= '3.8'", + "version": "==4.10.0" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-batch-laundering/README.md b/ecs/jskult-batch-laundering/README.md new file mode 100644 index 00000000..723e97fb --- /dev/null +++ b/ecs/jskult-batch-laundering/README.md @@ -0,0 +1,73 @@ +# 実消化&アルトマーク実績全件洗替処理 + +## 概要 + +実績全件洗替処理の週次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_laundering.py」で行っている。 + + +## フォルダ構成 +├── .env.example -- ローカル実行用の環境変数のサンプル値。 +├── .dockerignore -- docker build時のコンテキストに含めるファイルの抑制リスト +├── .gitignore -- Git差分管理除外リスト +├── Dockerfile -- Dockerイメージを作成するためのファイル +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md -- 当ファイル +├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル +└── src -- ソースコードの保管場所 + ├── batch -- バッチ処理関連ソース置き場 + │ ├── batch_functions.py -- バッチ処理共通関数置き場 + │ └── laundering -- 実績全件洗替関連処理 + │ ├── create_inst_merge_for_laundering.py -- 洗替用マスタ作成処理 + │ └── sales_results_laundering.py -- 卸販売実績全件洗替処理 + ├── db + │ └── database.py -- データベース操作共通処理 + ├── error + │ └── exceptions.py -- カスタム例外 + ├── jobctrl_laundering.py -- 実績全件洗替処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 + ├── logging + │ └── get_logger.py -- ログ出力の共通処理 + └── system_var + ├── constants.py -- 定数ファイル + └── environment.py -- 環境変数ファイル + diff --git a/ecs/jskult-batch-laundering/entrypoint.py b/ecs/jskult-batch-laundering/entrypoint.py new file mode 100644 index 00000000..a17fe8a8 --- /dev/null +++ b/ecs/jskult-batch-laundering/entrypoint.py @@ -0,0 +1,10 @@ +"""実績全件洗替処理のエントリーポイント""" +from src import jobctrl_laundering + +if __name__ == '__main__': + try: + exit(jobctrl_laundering.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-batch-laundering/src/__init__.py b/ecs/jskult-batch-laundering/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/batch/batch_functions.py b/ecs/jskult-batch-laundering/src/batch/batch_functions.py new file mode 100644 index 00000000..3028d84b --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/batch_functions.py @@ -0,0 +1,48 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException + + +def get_batch_statuses() -> tuple[str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - dump取得状況区分 + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + + return batch_processing_flag, dump_status_kbn + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/__init__.py b/ecs/jskult-batch-laundering/src/batch/laundering/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py b/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py new file mode 100644 index 00000000..0fee58d5 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py @@ -0,0 +1,32 @@ +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('洗替用マスタ作成') + + +def exec(): + db = Database.get_instance() + + try: + db.connect() + + logger.debug('処理開始') + db.to_jst() + call_v_inst_merge_t_create(db) + call_inst_merge_t_create(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def call_v_inst_merge_t_create(db: Database): + db.execute('CALL src05.v_inst_merge_t_create()') + return + + +def call_inst_merge_t_create(db: Database): + db.execute('CALL src05.inst_merge_t_create()') + return diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py b/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py new file mode 100644 index 00000000..86b3c8e9 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py @@ -0,0 +1,155 @@ +from src.batch.batch_functions import logging_sql +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import environment + + +logger = get_logger('卸販売実績全件洗替') + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.to_jst() + logger.debug('処理開始') + # 卸販売実績テーブル(洗替後)作成 + _call_sales_lau_upsert(db) + # 1:卸組織洗替 + _call_whs_org_laundering(db) + # 3:HCO施設コードの洗替 + _update_sales_lau_from_vop_hco_merge_v(db) + # 4:メルク施設コードの洗替 + _update_mst_inst_laundering(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _call_sales_lau_upsert(db: Database): + # 卸販売実績テーブル(洗替後)作成 + # sales_lau_upsertの第3引数は、NEWDWH2021-1230の対応の結果、未使用の引数となっています + logger.info('sales_lau_upsert(プロシージャ―) 開始') + db.execute(f""" + CALL src05.sales_lau_upsert( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}', + (src05.get_syor_date() - interval {environment.SALES_LAUNDERING_EXTRACT_DATE_PERIOD} day), + src05.get_syor_date() + ) + """) + logger.info('sales_lau_upsert(プロシージャ―) 終了') + return + + +def _call_whs_org_laundering(db: Database): + # 卸組織洗替 + logger.info('whs_org_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.whs_org_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('whs_org_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_vop_hco_merge_v(db: Database): + # HCO施設コードの洗替 + if _count_v_inst_merge_t(db) == 0: + logger.info('V施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + + _call_v_inst_merge_laundering(db) + return + + +def _count_v_inst_merge_t(db: Database) -> int: + # V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(v_inst_cd) AS cnt + FROM + internal05.v_inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_v_inst_merge_laundering(db: Database): + # HCO施設コードの洗替(プロシージャ―の呼び出し) + logger.info('v_inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.v_inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('v_inst_merge_laundering(プロシージャ―) 終了') + return + + +def _update_mst_inst_laundering(db: Database): + # メルク施設コードの洗替 + _call_hco_to_mdb_laundering(db) + _update_sales_lau_from_dcf_inst_merge(db) + + +def _call_hco_to_mdb_laundering(db: Database): + # A:医療機関のデータはMDB変換表からHCO⇒DCFへ変換 + logger.info('hco_to_mdb_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.hco_to_mdb_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('hco_to_mdb_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_dcf_inst_merge(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする + if _count_inst_merge_t(db) == 0: + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + _call_inst_merge_laundering(db) + return + + +def _count_inst_merge_t(db: Database) -> int: + # アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(dcf_dsf_inst_cd) AS cnt + FROM + internal05.inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_inst_merge_laundering(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(プロシージャ―の呼び出し) + logger.info('inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('inst_merge_laundering(プロシージャ―) 終了') + return diff --git a/ecs/jskult-batch-laundering/src/db/__init__.py b/ecs/jskult-batch-laundering/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/db/database.py b/ecs/jskult-batch-laundering/src/db/database.py new file mode 100644 index 00000000..02904db0 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/db/database.py @@ -0,0 +1,195 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __transactional_engine: Engine = None + __autocommit_engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __autocommit: bool = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str, autocommit: bool = False) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + autocommit(bool): 自動コミットモードで接続するかどうか(Trueの場合、トランザクションの有無に限らず即座にコミットされる). Defaults to False. + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + self.__autocommit = autocommit + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4", "local_infile": "1"}, + ) + + self.__transactional_engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + self.__autocommit_engine = self.__transactional_engine.execution_options(isolation_level='AUTOCOMMIT') + + @classmethod + def get_instance(cls, autocommit=False): + """インスタンスを取得します + + Args: + autocommit (bool, optional): 自動コミットモードで接続するかどうか(Trueの場合、トランザクションの有無に限らず即座にコミットされる). Defaults to False. + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA, + autocommit=autocommit + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。\n + インスタンスのautocommitがTrueの場合、自動コミットモードで接続する。(明示的なトランザクションも無視される) + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = ( + self.__autocommit_engine.connect() if self.__autocommit is True + else self.__transactional_engine.connect()) + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def to_jst(self): + self.execute('SET time_zone = "+9:00"') + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-batch-laundering/src/error/__init__.py b/ecs/jskult-batch-laundering/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/error/exceptions.py b/ecs/jskult-batch-laundering/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-batch-laundering/src/jobctrl_laundering.py b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py new file mode 100644 index 00000000..b06589e4 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py @@ -0,0 +1,39 @@ +"""実消化&アルトマーク実績全件洗替処理""" +from src.batch.batch_functions import get_batch_statuses +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants +from src.batch.laundering import (sales_results_laundering, + create_inst_merge_for_laundering) + +logger = get_logger('卸販売実績全件洗替') + + +def exec(): + try: + logger.info('週次バッチ:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + batch_processing_flag, dump_status_kbn = get_batch_statuses() + except BatchOperationException as e: + logger.exception(f'日付テーブル取得(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 日次バッチ処理中の場合、後続の処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.warning('日次バッチ処理中のため、実消化&アルトマーク実績全件洗替処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump取得が正常終了していない場合、後続の処理は行わない + if dump_status_kbn != constants.DUMP_STATUS_KBN_UNPROCESSED: + logger.warning('dump取得が正常終了していないため、実消化&アルトマーク実績全件洗替処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 洗替用マスタ作成 + create_inst_merge_for_laundering.exec() + # 卸販売実績全件洗替 + sales_results_laundering.exec() + logger.info('週次バッチ:終了') + except Exception as e: + logger.exception(f'実消化&アルトマーク実績全件洗替処理中に想定外のエラーが発生しました {e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-batch-laundering/src/logging/get_logger.py b/ecs/jskult-batch-laundering/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-batch-laundering/src/system_var/__init__.py b/ecs/jskult-batch-laundering/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/system_var/constants.py b/ecs/jskult-batch-laundering/src/system_var/constants.py new file mode 100644 index 00000000..ed3ea806 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/system_var/constants.py @@ -0,0 +1,8 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' + +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' diff --git a/ecs/jskult-batch-laundering/src/system_var/environment.py b/ecs/jskult-batch-laundering/src/system_var/environment.py new file mode 100644 index 00000000..0e08f06b --- /dev/null +++ b/ecs/jskult-batch-laundering/src/system_var/environment.py @@ -0,0 +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.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)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD = int(os.environ['SALES_LAUNDERING_EXTRACT_DATE_PERIOD']) +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME = os.environ['SALES_LAUNDERING_TARGET_TABLE_NAME'] diff --git a/ecs/jskult-dbdump/.dockerignore b/ecs/jskult-dbdump/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-dbdump/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-dbdump/.env.example b/ecs/jskult-dbdump/.env.example new file mode 100644 index 00000000..6db2d461 --- /dev/null +++ b/ecs/jskult-dbdump/.env.example @@ -0,0 +1,15 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult + +DUMP_BACKUP_FOLDER=dump + +LOG_LEVEL=INFO +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ diff --git a/ecs/jskult-dbdump/.gitignore b/ecs/jskult-dbdump/.gitignore new file mode 100644 index 00000000..cf44449e --- /dev/null +++ b/ecs/jskult-dbdump/.gitignore @@ -0,0 +1,11 @@ +.vscode/settings.json +.env +my.cnf + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-dbdump/.vscode/launch.json b/ecs/jskult-dbdump/.vscode/launch.json new file mode 100644 index 00000000..a0178c26 --- /dev/null +++ b/ecs/jskult-dbdump/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)jskult batch dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-dbdump/.vscode/recommended_settings.json b/ecs/jskult-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/jskult-dbdump/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-dbdump/Pipfile b/ecs/jskult-dbdump/Pipfile new file mode 100644 index 00000000..65b30a51 --- /dev/null +++ b/ecs/jskult-dbdump/Pipfile @@ -0,0 +1,19 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-dbdump/Pipfile.lock b/ecs/jskult-dbdump/Pipfile.lock new file mode 100644 index 00000000..cb296143 --- /dev/null +++ b/ecs/jskult-dbdump/Pipfile.lock @@ -0,0 +1,218 @@ +{ + "_meta": { + "hash": { + "sha256": "e2e2efd7ebd6ad719931983f277105dd94c4ebb6363f7c00e75dd8ca05523713" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "greenlet": { + "hashes": [ + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.3" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.1.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.0.28" + }, + "tenacity": { + "hashes": [ + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==8.2.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" + ], + "markers": "python_version >= '3.8'", + "version": "==4.10.0" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-dbdump/README.md b/ecs/jskult-dbdump/README.md new file mode 100644 index 00000000..7d8f0ccd --- /dev/null +++ b/ecs/jskult-dbdump/README.md @@ -0,0 +1,48 @@ +# 日次バッチ処理前DBダンプ取得  + +## 概要 + +日次バッチ処理前DBダンプ取得処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_dbdump.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/jskult-dbdump/entrypoint.py b/ecs/jskult-dbdump/entrypoint.py new file mode 100644 index 00000000..543cb134 --- /dev/null +++ b/ecs/jskult-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" +from src import jobctrl_dbdump + +if __name__ == '__main__': + try: + exit(jobctrl_dbdump.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-dbdump/mysql_dpkg_selection.txt b/ecs/jskult-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/jskult-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/jskult-dbdump/src/__init__.py b/ecs/jskult-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/batch/batch_functions.py b/ecs/jskult-dbdump/src/batch/batch_functions.py new file mode 100644 index 00000000..eece0536 --- /dev/null +++ b/ecs/jskult-dbdump/src/batch/batch_functions.py @@ -0,0 +1,131 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants + + +def get_batch_statuses() -> tuple[str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - dump取得状況区分 + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + + return batch_processing_flag, dump_status_kbn + + +def update_dump_status_kbn_in_processing() -> None: + """dump取得状況区分を処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :in_processing, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_error() -> None: + """dump取得状況区分をエラーに更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_ERROR + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_complete() -> None: + """dump取得状況区分を正常終了に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_COMPLETE + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-dbdump/src/batch/common/__init__.py b/ecs/jskult-dbdump/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/db/__init__.py b/ecs/jskult-dbdump/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/db/database.py b/ecs/jskult-dbdump/src/db/database.py new file mode 100644 index 00000000..24bb6061 --- /dev/null +++ b/ecs/jskult-dbdump/src/db/database.py @@ -0,0 +1,180 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.system_var import environment + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def to_jst(self): + self.execute('SET time_zone = "+9:00"') + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-dbdump/src/error/__init__.py b/ecs/jskult-dbdump/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/error/exceptions.py b/ecs/jskult-dbdump/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-dbdump/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py new file mode 100644 index 00000000..1cc5a89b --- /dev/null +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -0,0 +1,122 @@ +"""日次バッチ処理前DBダンプ取得""" + +import datetime +import os +import subprocess +import textwrap + +from src.batch.batch_functions import (get_batch_statuses, + update_dump_status_kbn_complete, + update_dump_status_kbn_error, + update_dump_status_kbn_in_processing) +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('日次バッチ処理前DBダンプ取得') + + +def exec(): + try: + logger.info('日次バッチ処理前DBダンプ取得:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分を取得 + batch_processing_flag, dump_status_kbn = get_batch_statuses() + except BatchOperationException as e: + raise BatchOperationException(f'日付テーブル取得エラー(異常終了):{e}') + + # 日次バッチ処理中の場合、処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('日次バッチ処理中の為、日次バッチ処理前DBダンプ取得を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分が処理中の場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED: + logger.error(f'ダンプ取得中の為、日次バッチ処理前DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分がエラーの場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: + logger.error(f'ダンプ取得が実行不可能な状態の為、日次バッチ処理前DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分を処理中に更新 + try: + update_dump_status_kbn_in_processing() + except BatchOperationException as e: + raise BatchOperationException(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了):{e}') + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + dt_now = datetime.datetime.now() + converted_value = dt_now.strftime('%Y%m%d%H%M%S') + dump_file_name = f'backup_rds_src05_{converted_value}.gz' + s3_file_path = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' + + # mysqldumpコマンドを実行し、dumpを取得する + command = [ + 'mysqldump', + f'--defaults-file={my_cnf_path}', + '-P', + f"{environment.DB_PORT}", + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', + environment.DB_SCHEMA + ] + + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gzipコマンドを実行してdump結果を圧縮する + gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # aws s3 cpコマンドを実行してアップロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする + mysqldump_process.stdout.close() + # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = mysqldump_process.communicate() + if mysqldump_process.returncode != 0: + raise BatchOperationException(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = gzip_process.communicate() + if gzip_process.returncode != 0: + raise BatchOperationException(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + raise BatchOperationException(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + # dump処理状態区分を正常終了に更新 + try: + update_dump_status_kbn_complete() + except BatchOperationException as e: + raise BatchOperationException(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') + + logger.info('日次バッチ処理前DBダンプ取得:終了(正常終了)') + logger.info(f'出力ファイルパス: {s3_file_path}') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + # dump処理状態区分をエラーに更新 + try: + update_dump_status_kbn_error() + except BatchOperationException as e: + logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-dbdump/src/logging/get_logger.py b/ecs/jskult-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-dbdump/src/system_var/__init__.py b/ecs/jskult-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/system_var/constants.py b/ecs/jskult-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..993e5a7d --- /dev/null +++ b/ecs/jskult-dbdump/src/system_var/constants.py @@ -0,0 +1,15 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:処理中 +DUMP_STATUS_KBN_PROCESSED = '1' +# dump取得状態区分:正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' +# dump取得状態区分:エラー +DUMP_STATUS_KBN_ERROR = '9' diff --git a/ecs/jskult-dbdump/src/system_var/environment.py b/ecs/jskult-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..ff510581 --- /dev/null +++ b/ecs/jskult-dbdump/src/system_var/environment.py @@ -0,0 +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'] + +# AWS +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +DUMP_BACKUP_FOLDER = os.environ['DUMP_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)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + diff --git a/ecs/jskult-restore-backup/.dockerignore b/ecs/jskult-restore-backup/.dockerignore new file mode 100644 index 00000000..d826198a --- /dev/null +++ b/ecs/jskult-restore-backup/.dockerignore @@ -0,0 +1,13 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql +*.gz diff --git a/ecs/jskult-restore-backup/.env.example b/ecs/jskult-restore-backup/.env.example new file mode 100644 index 00000000..2bda940a --- /dev/null +++ b/ecs/jskult-restore-backup/.env.example @@ -0,0 +1,9 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +JSKULT_BACKUP_DUMP_S3_FILE_PATH=******************* + +LOG_LEVEL=INFO diff --git a/ecs/jskult-restore-backup/.gitignore b/ecs/jskult-restore-backup/.gitignore new file mode 100644 index 00000000..339d80cc --- /dev/null +++ b/ecs/jskult-restore-backup/.gitignore @@ -0,0 +1,16 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ + +# mysql config file +my.cnf + +# compress file +*.gz \ No newline at end of file diff --git a/ecs/jskult-restore-backup/.vscode/launch.json b/ecs/jskult-restore-backup/.vscode/launch.json new file mode 100644 index 00000000..a0178c26 --- /dev/null +++ b/ecs/jskult-restore-backup/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)jskult batch dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-restore-backup/.vscode/recommended_settings.json b/ecs/jskult-restore-backup/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-restore-backup/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-restore-backup/Dockerfile b/ecs/jskult-restore-backup/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/jskult-restore-backup/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-restore-backup/Pipfile b/ecs/jskult-restore-backup/Pipfile new file mode 100644 index 00000000..f032c7ea --- /dev/null +++ b/ecs/jskult-restore-backup/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-restore-backup/Pipfile.lock b/ecs/jskult-restore-backup/Pipfile.lock new file mode 100644 index 00000000..9a57d92d --- /dev/null +++ b/ecs/jskult-restore-backup/Pipfile.lock @@ -0,0 +1,69 @@ +{ + "_meta": { + "hash": { + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-restore-backup/README.md b/ecs/jskult-restore-backup/README.md new file mode 100644 index 00000000..e9dfa8f7 --- /dev/null +++ b/ecs/jskult-restore-backup/README.md @@ -0,0 +1,67 @@ +# 実消化&アルトマークダンプ復元スクリプト + +## 概要 + +実消化&アルトマークダンプ復元スクリプト + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/restore_backup.py」で行っている。 + +## フォルダ構成 + +```txt +. +├── .env.example -- ローカル実行用の環境変数のサンプル値。 +├── .dockerignore -- docker build時のコンテキストに含めるファイルの抑制リスト +├── .gitignore -- Git差分管理除外リスト +├── Dockerfile -- Dockerイメージ作成用 +├── Pipfile -- pythonの依存関係管理 +├── Pipfile.lock -- 依存関係バージョン固定 +├── README.md -- 当ファイル +├── entrypoint.py -- エントリーポイントとなるファイル +├── mysql_dpkg_selection.txt -- Dockerイメージでdpkgを使うときに外部から注入する選択値 +└── src -- ソースコードフォルダ + ├── logging + │ └── get_logger.py -- ロガー + ├── restore_backup.py -- dump復元処理本体 + └── system_var + ├── constants.py -- 定数ファイル + └── environment.py -- 環境変数ファイル +``` diff --git a/ecs/jskult-restore-backup/entrypoint.py b/ecs/jskult-restore-backup/entrypoint.py new file mode 100644 index 00000000..70f48060 --- /dev/null +++ b/ecs/jskult-restore-backup/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク DBダンプ復元のエントリーポイント""" +from src import restore_backup + +if __name__ == '__main__': + try: + exit(restore_backup.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-restore-backup/mysql_dpkg_selection.txt b/ecs/jskult-restore-backup/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/jskult-restore-backup/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/jskult-restore-backup/src/__init__.py b/ecs/jskult-restore-backup/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-restore-backup/src/logging/get_logger.py b/ecs/jskult-restore-backup/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-restore-backup/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-restore-backup/src/restore_backup.py b/ecs/jskult-restore-backup/src/restore_backup.py new file mode 100644 index 00000000..b72d3625 --- /dev/null +++ b/ecs/jskult-restore-backup/src/restore_backup.py @@ -0,0 +1,62 @@ +"""実消化&アルトマークダンプ復元スクリプト""" + +import os +import subprocess +import textwrap + +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('実消化&アルトマークダンプ復元スクリプト') + + +def exec(): + try: + logger.info('実消化&アルトマークダンプ復元スクリプト:開始') + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + # 復元対象のダンプファイルを特定 + s3_file_path = environment.JSKULT_BACKUP_DUMP_S3_FILE_PATH + + # aws s3 cpコマンドを実行してdumpファイルをローカルにダウンロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + # S3コマンドの標準エラーはクローズしておく + s3_cp_process.stderr.close() + + # gzipコマンドを実行してdumpファイルを解凍する + gzip_process = subprocess.Popen(['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # mysqlコマンドを実行し、dumpを復元する + mysql_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], + stdin=gzip_process.stdout, stderr=subprocess.PIPE + ) + # gzipの標準出力をmysqlに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + _, error = mysql_process.communicate() + if mysql_process.returncode != 0: + logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('[NOTICE]実消化&アルトマークダンプ復元スクリプト:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'実消化&アルトマークダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-restore-backup/src/system_var/__init__.py b/ecs/jskult-restore-backup/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-restore-backup/src/system_var/constants.py b/ecs/jskult-restore-backup/src/system_var/constants.py new file mode 100644 index 00000000..8a555af3 --- /dev/null +++ b/ecs/jskult-restore-backup/src/system_var/constants.py @@ -0,0 +1,2 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 diff --git a/ecs/jskult-restore-backup/src/system_var/environment.py b/ecs/jskult-restore-backup/src/system_var/environment.py new file mode 100644 index 00000000..ee0e9be3 --- /dev/null +++ b/ecs/jskult-restore-backup/src/system_var/environment.py @@ -0,0 +1,14 @@ +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'] + +# AWS +JSKULT_BACKUP_DUMP_S3_FILE_PATH = os.environ['JSKULT_BACKUP_DUMP_S3_FILE_PATH'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-webapp/.dockerignore b/ecs/jskult-webapp/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-webapp/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example new file mode 100644 index 00000000..6afc42c6 --- /dev/null +++ b/ecs/jskult-webapp/.env.example @@ -0,0 +1,29 @@ +#AWS +##Cognito +COGNITO_AUTH_DOMAIN=******* +COGNITO_IDENTITY_PROVIDER=********* +COGNITO_REDIRECT_URI=***************** +COGNITO_USER_POOL_ID=******************** +COGNITO_CLIENT_ID=********************** +COGNITO_CLIENT_SECRET=****************************** +##DynamoDB +SESSION_TABLE_NAME=*********************** +##S3 +BIO_ACCESS_LOG_BUCKET=******************* +MASTER_MAINTENANCE_BUCKET=mbj-newdwh2021-staging-jskult-master-maintenance +#MySQL +DB_HOST=************ +DB_PORT=************ +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +#実装の設定(task_settingsに設定するパラメータ) +AWS_REGION=ap-northeast-1 +AUTHORIZE_ENDPOINT=oauth2/authorize +TOKEN_ENDPOINT=oauth2/token +BIO_SEARCH_RESULT_MAX_COUNT=35000 +BIO_EXCEL_RESULT_MAX_COUNT=15000 +ULTMARC_SEARCH_RESULT_MAX_COUNT=500 +SESSION_EXPIRE_MINUTE=20 +LOG_LEVEL=DEBUG \ No newline at end of file diff --git a/ecs/jskult-webapp/.gitignore b/ecs/jskult-webapp/.gitignore new file mode 100644 index 00000000..47b5c64c --- /dev/null +++ b/ecs/jskult-webapp/.gitignore @@ -0,0 +1,6 @@ +__pycache__ + +.vscode/settings.json +.env +src/data/* +!src/data/BioData_template.xlsx diff --git a/ecs/jskult-webapp/.vscode/launch.json b/ecs/jskult-webapp/.vscode/launch.json new file mode 100644 index 00000000..a3a5a0b8 --- /dev/null +++ b/ecs/jskult-webapp/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch AP Server(FastAPI)", + "type": "python", + "request": "launch", + "module": "uvicorn", + "args": ["src.main:app","--reload", "--no-server-header"], + "justMyCode": true, + "envFile": "${workspaceFolder}/.env" + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-webapp/.vscode/recommended_settings.json b/ecs/jskult-webapp/.vscode/recommended_settings.json new file mode 100644 index 00000000..d5ce3e07 --- /dev/null +++ b/ecs/jskult-webapp/.vscode/recommended_settings.json @@ -0,0 +1,18 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": ["--max-line-length=120"], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Args": ["--max-line-length", "120"] +} diff --git a/ecs/jskult-webapp/Dockerfile b/ecs/jskult-webapp/Dockerfile new file mode 100644 index 00000000..d0285a04 --- /dev/null +++ b/ecs/jskult-webapp/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src + +CMD ["gunicorn", "src.main:app", "-w", "2", "-k" ,"uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:80", "--timeout", "1200", "--keep-alive", "1200"] diff --git a/ecs/jskult-webapp/Pipfile b/ecs/jskult-webapp/Pipfile new file mode 100644 index 00000000..2fb1efb9 --- /dev/null +++ b/ecs/jskult-webapp/Pipfile @@ -0,0 +1,38 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[scripts] +app = "uvicorn src.main:app --reload --no-server-header" +"app:local" = "gunicorn src.main:app -w 2 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8000 --timeout 1200 --keep-alive 1200" + +[packages] +fastapi = "==0.*" +pydantic = "==2.*" +uvicorn = "*" +"uvicorn[standard]" = "*" +gunicorn = "*" +boto3 = "*" +jinja2 = "*" +pyjwt = "*" +"pyjwt[crypto]" = "*" +requests = "*" +python-multipart = "*" +pynamodb = "*" +PyMySQL = "*" +pandas = "*" +openpyxl = "*" +xlrd = "*" +sqlalchemy = "==2.*" +mojimoji = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock new file mode 100644 index 00000000..2c605b9b --- /dev/null +++ b/ecs/jskult-webapp/Pipfile.lock @@ -0,0 +1,1234 @@ +{ + "_meta": { + "hash": { + "sha256": "bd31adfb775153ccfd51bc60a1c9a8800d469b1352576d79800e82384d9c1ebd" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "annotated-types": { + "hashes": [ + "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", + "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, + "anyio": { + "hashes": [ + "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", + "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" + ], + "markers": "python_version >= '3.8'", + "version": "==4.3.0" + }, + "boto3": { + "hashes": [ + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "botocore": { + "hashes": [ + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" + ], + "markers": "python_version >= '3.8'", + "version": "==1.34.61" + }, + "certifi": { + "hashes": [ + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.2.2" + }, + "cffi": { + "hashes": [ + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.16.0" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "cryptography": { + "hashes": [ + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" + ], + "version": "==42.0.5" + }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_version >= '3.6'", + "version": "==1.1.0" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.0" + }, + "fastapi": { + "hashes": [ + "sha256:266775f0dcc95af9d3ef39bad55cff525329a931d5fd51930aadd4f428bf7ff3", + "sha256:87a1f6fb632a218222c5984be540055346a8f5d8a68e8f6fb647b1dc9934de4b" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.110.0" + }, + "greenlet": { + "hashes": [ + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.3" + }, + "gunicorn": { + "hashes": [ + "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0", + "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033" + ], + "index": "pypi", + "markers": "python_version >= '3.5'", + "version": "==21.2.0" + }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, + "httptools": { + "hashes": [ + "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563", + "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142", + "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d", + "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b", + "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4", + "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb", + "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658", + "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084", + "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2", + "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97", + "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837", + "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3", + "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58", + "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da", + "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d", + "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90", + "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0", + "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1", + "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2", + "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e", + "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0", + "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf", + "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc", + "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3", + "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503", + "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a", + "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3", + "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949", + "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84", + "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb", + "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a", + "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f", + "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e", + "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81", + "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185", + "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3" + ], + "version": "==0.6.1" + }, + "idna": { + "hashes": [ + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + ], + "markers": "python_version >= '3.5'", + "version": "==3.6" + }, + "jinja2": { + "hashes": [ + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.3" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "mojimoji": { + "hashes": [ + "sha256:01130d705445c4b41dcb6177b82ef6ae54ae13dc8d7ad9bf1a673acf0db8059c", + "sha256:0e6d2fba22cc8bf132a5bdf3a964296d9287a618d09681a12868f0fd518e4230", + "sha256:1087035b4b0d5f2be0db74ccdb285e0bcf977a8c24e47ee93cd084570d073648", + "sha256:18422803dc00703ebf4969a6d6957bd9099913295f0578c9e29ee25d4988ed7f", + "sha256:2402eaf2a5f963735c44e59559fa00ee8eb8dec46c0e3f29bfdb1ee49d7a75df", + "sha256:308a6b43c3c9c5a6d912e1984d02aa58ccabb83c9e57c5edb71389c90187d6d3", + "sha256:3c5fd38d1f4079dc54ac79f93b0e5442c660b297a3868308251ffc37beb1216b", + "sha256:507c73837b19c17918de5d2afccdaaed95cf00d1e9e38eac93ab39c8fc0930f8", + "sha256:522eff5b0fd3ea2cdbeae27581a684174ed843dd7b9076791bf344a746a1ed8f", + "sha256:535f278df0a26280e904cd3688ae610414b176cc373431ac31e378305ee96452", + "sha256:60a7358d7d413d4ea9c92e3b523ab4e701e30cefc505b2f1409761fc9e7ba730", + "sha256:6b627a62c18655adb36b9b2a420b7f43a0d2f39ebe2aa01418968d6dc71bb104", + "sha256:6e442d6dcfb2fc1a08eea86da80ebe71ad63fbc4217fa4faede7023c0b51d055", + "sha256:761c1bcca7146b24c82b72645fbb80dbe6d373792e84f7d71bafa538c0b170af", + "sha256:7fc8a9caeea0147eee642a50c004fc64f0c1410736423f74802cf9950ae14b43", + "sha256:853d87ce8fbef597bc3a1f23a9f95f6a4267f697e28fc85c665598c190b4b71c", + "sha256:8feb1b8bf21eae1c35fca72a8c2c05c9a12271d882a02b01608d746d3dbab684", + "sha256:918f415c42cabde6128faba93be92482a4fb1f40d0d800727e04716aef40c94e", + "sha256:98ea6f420f1298eb6a36b759551b22d133fe882da407f3eccf8c2cc5d302d05f", + "sha256:99472af3849bd795970ecc9102f1007350cb8aef0ff21ba0511c121fe94c3ffe", + "sha256:9d8f1618fb9b100bba172f2629df20e6db591ce5912996ac630d215627dd7553", + "sha256:9f2284489d1b8330bb785eb844c1a6a6a2346c95bc3f52088084c71b4a1fb234", + "sha256:a27b8cec5e05db2a7acc475a7ab70b840cf2087bcb2d4a276b89a3f9d20b0887", + "sha256:a5dfcef1fc16360aab65b8b60518a9d19cc7916ffc296ee0907819490686429e", + "sha256:ab1aee2ef6a170b26e431733767361dfc12983847f2be23f6dc2311de7b98df0", + "sha256:ad4a2e1fb2b643ac3166f30be97a95ad1877e4670c6dc656c4ef580681b84c49", + "sha256:b44d0a99b69bca583e497cf217d2573f9a01ca49d9dc23116bffb196efdb192f", + "sha256:c97d7c1861635cd538f44bf70dd27ed24435b0f8fe634ca52c49cb4c4424d6fa", + "sha256:c97ee81e4f7083df13b8ef690366e67afd8170c8f7c259161bae6ed12d41fe5b", + "sha256:cc0f872b573218bfac9532ccb2f52f6279e8aa337654bbb28e90f0051d3ceb0b", + "sha256:d001f2042073b194bad071925b7ee36d9f320b79c93b4463df87267fee986e86", + "sha256:d27f88051d4fde5b2fdb1a07e3064c950541da6d25e3f1829eedededc015b0c2", + "sha256:d4e35fed7eb8ac573eef365d4a614c952179ad4e0e27a8e32d22e6c57a945b8c", + "sha256:da069e1c48f54de4c4c372c74cf8c7f27487449d1547337aaedc21b26538b5e7", + "sha256:ea2f75e93425f0bcfaef68c189845ec9a212d37a4997ffa35353ef7e5c57ca9a", + "sha256:f617ebe1fdceadc2b87497c4d56f3c863155179488feb63f83a62cf95df37b69" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.0.13" + }, + "numpy": { + "hashes": [ + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" + ], + "markers": "python_version < '3.11'", + "version": "==1.26.4" + }, + "openpyxl": { + "hashes": [ + "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", + "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==3.1.2" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + ], + "markers": "python_version >= '3.7'", + "version": "==24.0" + }, + "pandas": { + "hashes": [ + "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee", + "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e", + "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572", + "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944", + "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403", + "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89", + "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab", + "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6", + "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb", + "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9", + "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019", + "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be", + "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd", + "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c", + "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88", + "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0", + "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397", + "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc", + "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2", + "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7", + "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06", + "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51", + "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0", + "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a", + "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16", + "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02", + "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359", + "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b", + "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.2.1" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" + }, + "pydantic": { + "hashes": [ + "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6", + "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.6.4" + }, + "pydantic-core": { + "hashes": [ + "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a", + "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed", + "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979", + "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff", + "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5", + "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45", + "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340", + "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad", + "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23", + "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6", + "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7", + "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241", + "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda", + "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187", + "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba", + "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c", + "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2", + "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c", + "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132", + "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf", + "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972", + "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db", + "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade", + "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4", + "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8", + "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f", + "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9", + "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48", + "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec", + "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d", + "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9", + "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb", + "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4", + "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89", + "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c", + "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9", + "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da", + "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac", + "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b", + "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf", + "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e", + "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137", + "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1", + "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b", + "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8", + "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e", + "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053", + "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01", + "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe", + "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd", + "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805", + "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183", + "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8", + "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99", + "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820", + "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074", + "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256", + "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8", + "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975", + "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad", + "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e", + "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca", + "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df", + "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b", + "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a", + "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a", + "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721", + "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a", + "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f", + "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2", + "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97", + "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6", + "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed", + "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc", + "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1", + "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe", + "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120", + "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f", + "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.16.3" + }, + "pyjwt": { + "hashes": [ + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.8.0" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "markers": "python_version >= '3.7'", + "version": "==1.1.0" + }, + "pynamodb": { + "hashes": [ + "sha256:05b3aa02021050393e0667944a20af3da60f55984de86126786844c2d47b9a18", + "sha256:7217f87b6e5c9866d915265fd462fa4a012b37b0149bf1f814b33100b50e901f" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==6.0.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "python-dotenv": { + "hashes": [ + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" + ], + "version": "==1.0.1" + }, + "python-multipart": { + "hashes": [ + "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026", + "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.0.9" + }, + "pytz": { + "hashes": [ + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + ], + "version": "==2024.1" + }, + "pyyaml": { + "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "version": "==6.0.1" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "s3transfer": { + "hashes": [ + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sniffio": { + "hashes": [ + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.0.28" + }, + "starlette": { + "hashes": [ + "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044", + "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080" + ], + "markers": "python_version >= '3.8'", + "version": "==0.36.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" + ], + "markers": "python_version >= '3.8'", + "version": "==4.10.0" + }, + "tzdata": { + "hashes": [ + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" + ], + "markers": "python_version >= '2'", + "version": "==2024.1" + }, + "urllib3": { + "hashes": [ + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.18" + }, + "uvicorn": { + "hashes": [ + "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1", + "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.28.0" + }, + "uvloop": { + "hashes": [ + "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd", + "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec", + "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b", + "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc", + "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797", + "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5", + "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2", + "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d", + "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be", + "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd", + "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12", + "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17", + "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef", + "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24", + "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428", + "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1", + "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849", + "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593", + "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd", + "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67", + "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6", + "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3", + "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd", + "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8", + "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7", + "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533", + "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957", + "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650", + "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e", + "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7", + "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256" + ], + "version": "==0.19.0" + }, + "watchfiles": { + "hashes": [ + "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc", + "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365", + "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0", + "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e", + "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124", + "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c", + "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317", + "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094", + "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7", + "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235", + "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c", + "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c", + "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c", + "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235", + "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293", + "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa", + "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef", + "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19", + "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8", + "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d", + "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915", + "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429", + "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097", + "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe", + "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0", + "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d", + "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99", + "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1", + "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a", + "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895", + "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94", + "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562", + "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab", + "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360", + "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1", + "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7", + "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f", + "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03", + "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01", + "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58", + "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052", + "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e", + "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765", + "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6", + "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137", + "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85", + "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca", + "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f", + "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214", + "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7", + "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7", + "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3", + "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b", + "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7", + "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6", + "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994", + "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9", + "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec", + "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128", + "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c", + "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2", + "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078", + "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3", + "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e", + "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a", + "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6", + "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49", + "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b", + "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28", + "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9", + "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586", + "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400", + "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165", + "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303", + "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d" + ], + "version": "==0.21.0" + }, + "websockets": { + "hashes": [ + "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b", + "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6", + "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", + "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", + "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205", + "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892", + "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53", + "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", + "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", + "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c", + "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd", + "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", + "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931", + "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30", + "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370", + "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be", + "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec", + "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf", + "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62", + "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b", + "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", + "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", + "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123", + "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9", + "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603", + "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", + "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558", + "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", + "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438", + "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137", + "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480", + "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", + "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8", + "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", + "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c", + "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", + "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967", + "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", + "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d", + "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def", + "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", + "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", + "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2", + "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", + "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b", + "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28", + "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7", + "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d", + "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", + "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468", + "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8", + "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae", + "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611", + "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", + "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9", + "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", + "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f", + "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2", + "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077", + "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2", + "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6", + "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374", + "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", + "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", + "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", + "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399", + "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547", + "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", + "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870", + "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", + "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8", + "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7" + ], + "version": "==12.0" + }, + "xlrd": { + "hashes": [ + "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", + "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" + ], + "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==2.0.1" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md new file mode 100644 index 00000000..c65cbf83 --- /dev/null +++ b/ecs/jskult-webapp/README.md @@ -0,0 +1,235 @@ +# 実消化&アルトマーク Webアプリケーション + +## 概要 + +実消化&アルトマークのWebアプリケーション。 +以下の機能を提供する + +- アルトマークデータ照会(施設・医師) +- 生物由来データ照会 +- マスターメンテナンス + +## 環境情報 + +- Python 3.9 +- MySQL 8.x +- FastAPI + - PythonのWebアプリケーションフレームワーク +- VSCode + +## 環境構築 + +- Pythonの構築 + - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenvの導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する + - `pipenv install --python --dev` + - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく + +- MySQLの環境構築 + - Windowsの場合、以下のリンクからダウンロードする + - + - Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください +- VSCodeの設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode上で「F5」キーを押下すると、Webアプリケーションのサーバーが起動する +- 「」にアクセスし、ログイン画面が表示されていれば成功 + +## フォルダ構成 + +```text +. +├── Dockerfile -- Dockerイメージを作成するためのファイル +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md -- 当ファイル +└── src -- ソースコードの保管場所 + ├── aws -- AWSリソース操作用のコード + │   ├── aws_api_client.py + │   ├── cognito.py + │   └── s3.py + ├── controller -- ルーティング層。基本的に1画面1つ + │   ├── bio.py + │   ├── bio_download.py + │   ├── login.py + │   ├── logout.py + │   └── menu.py + ├── core -- APサーバーのコア設定。 + │   └── tasks.py -- 起動・終了時に実行するタスクを設定。 + ├── data -- 生物由来照会のエクセルファイルテンプレート。 + │   └── BioData_template.xlsx + ├── db -- データベース関連処理。 + │   ├── database.py -- データベース接続、クエリ発行の共通モジュール。 + │   ├── sql_condition.py -- SQLの条件式を組み立てるためのモジュール + │   └── tasks.py -- coreに渡すタスク。サーバー起動時にDBとの接続モジュールの初期化、終了時にインスタンス破棄を行っている。 + ├── depends -- FastAPIの依存性注入(DI)使用するモジュールの置き場。Dependsで利用想定。 + │   ├── auth.py -- セッション等の認証関連 + │   ├── database.py -- リポジトリ層をコントローラーにDIするためのもの + │   └── services.py -- サービス層をコントローラーにDIするためのもの + ├── error -- エラー処理関連のモジュール置き場 + │   ├── exception_handler.py -- FastAPI内部でエラー発生時のハンドリング + │   └── exceptions.py -- カスタム例外クラス + ├── main.py -- APサーバーのエントリーポイント。ここでルーターやハンドラーの登録を行う + ├── middleware -- ミドルウェアの設定 + │ └── middleware.py + ├── model -- モデル層(MVCのM) + │   ├── db -- リポジトリから返されるDBレコードのモデル + │   │   ├── base_db_model.py + │   │   ├── bio_sales_view.py + │   │   ├── hdke_tbl.py + │   │   ├── pharmacy_product_master.py + │   │   ├── user_master.py + │   │   └── wholesaler_master.py + │   ├── jwt_token.py -- 認証用JWTトークンのモデル + │   ├── request -- 画面からのリクエストを受け付けるモデル + │   │   ├── bio.py + │   │   ├── bio_download.py + │   │   └── login.py + │   ├── session.py -- セッションデータのモデル + │   └── view -- ビューモデル。画面に対応したモデル。 + │   ├── bio_disp_model.py + │   ├── bio_view_model.py + │   ├── logout_view_model.py + │   ├── mainte_login_view_model.py + │   ├── menu_view_model.py + │   └── user_view_model.py + ├── repositories -- リポジトリ層。DB操作モジュール置き場。 + │   ├── base_repository.py + │   ├── bio_sales_view_repository.py + │   ├── hdke_tbl_repository.py + │   ├── pharmacy_product_master_repository.py + │   ├── user_master_repository.py + │   └── wholesaler_master_repository.py + ├── router -- コントローラー層の共通ルーティングの定義 + │   └── session_router.py + ├── services -- サービス層。ビジネスロジックはできる限りここに押し込む + │   ├── base_service.py + │   ├── batch_status_service.py + │   ├── bio_view_service.py + │   ├── login_service.py + │   └── session_service.py + ├── static -- 静的ファイルの配信ルートディレクトリ + │   ├── css + │   │   ├── bioStyle.css + │   │   ├── datepicker.css + │   │   ├── menuStyle.css + │   │   └── pagenation.css + │   ├── function + │   │   └── businessLogicScript.js + │   ├── img + │   │   ├── icon_modal_confirm.png + │   │   └── icon_modal_error.png + │   ├── lib + │   │   └── fixed_midashi.js + │   ├── sample.css + │   └── sample.js + ├── system_var -- システム変数 + │   ├── constants.py -- 定数 + │   └── environment.py -- 環境変数 + ├── templates -- ビューテンプレートエンジンの格納場所(Jinja2) + │   ├── _header.html -- 共通ヘッダー + │   ├── _modal.html -- モーダルの部品 + │   ├── bioSearchList.html + │   ├── logout.html + │   ├── maintlogin.html + │   ├── menu.html + └── util -- ユーティリティ関数置き場 + ├── sanitize.py -- モデルクラスのサニタイズを行うデコレータ + └── string_util.py -- 文字列操作関連のユーティリティ +``` + +## (参考)ファイルの追いかけ方 + +- APサーバーそのものは「src/main」にある。 + - ルーター、例外処理ハンドラ、開始終了タスクの設定、静的ファイルディレクトリのマウントを行っている +- URLパスに対する操作の実装は、「controller」フォルダを見る + - `@router.xxx`の`xxx`の部分がHTTPメソッドに相当する。このデコレータが付与された関数が、HTTPメソッドを処理するパスオペレーション関数となる + - パスオペレーション関数の引数には、リクエストで受け取るパラメータと、その関数内で使用できる依存関係を注入できる + - Request型と、Response型の引数は、その名の通り。 + - str型, int型などの引数を指定した場合、その引数はクエリストリングを意味する + - Dependsで初期値が設定される引数は、Depends関数に渡した関数が処理されてから代入される + - たとえば、`get_service`関数にサービスクラスの型を渡すと、get_service関数でサービスクラスのインスタンスを作成して返してくれる + - サービスクラスはリポジトリクラスに依存しているので、自分でインスタンスを組み立てる手間が省ける + - formやリクエストボディのJSONを受け取る場合、リクエスト用のモデルクラスに「as_form」や「as_body」などの関数を実装し、リクエストを受け取れるようにする + - ビジネスロジックは基本的にサービスクラスに押し込む。コントローラーではそのサービスクラスをDependsで依存して利用すること +- ビジネスロジックに相当するサービスクラスは「services」フォルダに格納する。共通実装は以下。 + - REPOSITORIES定数に、依存するリポジトリクラスを辞書形式で指定する + - CLIENTS定数に、依存するAWS APIクライアントクラスを辞書形式で指定する + - `__init__`コンストラクタ内で、2つの定数に指定したキーに紐付いたインスタンスが渡ってくるため、インスタンス変数として登録する + - あとは、ビジネスロジックにあたる関数を生やしていく +- DBへのアクセスを行うリポジトリクラスは「repositories」フォルダに格納する。 + - SQL文を用意し、`_db`インスタンス変数のメソッドを利用してクエリを実行する。 + - 必要に応じて条件設定をする。条件設定には`SQLCondition`クラスを使用する。 + - `BioSalesViewRepository`のやり方が参考になる + - リポジトリクラスは、サービスクラスで利用するようにする(そのために、サービスクラス側に依存関係を書いている) +- モデルクラスは、「models」フォルダに格納する + - HTTPリクエスト用のモデルクラスは「request」フォルダへ + - ビュー表示用のモデルクラス(View Model)は「view」フォルダへ + - 画面への項目埋め込みや、非表示の制御を行うため、View Modelに値を詰めて、テンプレート側で操作するようにする + - DBから取得したレコードのモデルクラスは「db」フォルダへ + - 内部処理に利用するモデルクラスは「internal」フォルダへ +- 「static」フォルダは、静的ファイルの置き場所 + - CSS, JS、画像ファイルを置く。 + - 画面の細かな制御は「BusinessLogicScript.js」で行っている。現行からちょこちょこ変える必要がある。 + - CSSも、現行は画面ごとに分かれているが、一つのベーススタイルにまとめたい +- 「templates」フォルダは、テンプレートエンジンを格納する + - 各画面1つのテンプレートエンジンを用意する + - 内部で使う変数は、コントローラーで「templates.TemplateResponse」」に詰めて渡す + - テンプレート内でincludeする用途のテンプレートは先頭に「_」をつける + - `_header.html`は、``タグ内に記載する部品。共通的に読み込むCSS等のファイルを指定する。 + - PHPでは分岐などをベタ書きしているが、View Modelに宣言的な関数を用意して、可読性を向上させている。 +- コントローラーの共通処理は、「router」フォルダ内のモジュールで実装している + - コントローラーのrouter変数が、`router.route_class = AfterSetCookieSessionRoute`となっている場合、レスポンス時、クッキーにセッションキーを登録する動きをする + - コントローラーのrouter変数が、`router.route_class = Authenticate`となっている場合、以下の動きをする + - リクエスト到達時にセッションの有無をチェックする + - レスポンス時、クッキーにセッションキーを登録する + +## HTMLで読み込んでいるスクリプトのSRIハッシュ値を生成・設定する方法 + +### サブリソース完全性 (Subresource Integrity, SRI) とは + +CDN などから取得したリソースが意図せず改ざんされていないかをブラウザーが検証するセキュリティ機能です。 SRI を利用する際には、取得したリソースのハッシュ値と一致すべきハッシュ値を指定します。 + +詳細: + +実消化&アルトマークのWebアプリケーションでは、複数の外部スクリプトを読み込んで動作しているため、読み込むスクリプトを変更した場合は、 +タグの属性値`integrity`に設定されているスクリプトのハッシュ値を更新する必要がある。 + +### SRI ハッシュ値の生成方法(サーバー内のスクリプトについて) + +- サーバー内に保管されているスクリプトを更新した場合、Linux環境(WSL2でも可)で、以下のコマンドを実行し、ハッシュ値を生成する + +```bash +cat <更新したスクリプトファイル名> | openssl dgst -sha384 -binary | openssl base64 -A +``` + +参考: + + +### SRI ハッシュ値の生成方法(外部サイトから読み込んでいるスクリプトについて) + +- 外部サイトから読み込んでいるスクリプトを更新した場合、下記のMDNオンラインツールでハッシュ値を生成する + - [SRI Hash Generator](https://www.srihash.org/) + +### SRI ハッシュ値の設定方法 + +- 更新したスクリプトを読み込んでいる箇所の`integrity`属性値を、生成したハッシュ値に置き換える +- 以下は設定のサンプル + +```bash + +``` diff --git a/ecs/jskult-webapp/src/__init__.py b/ecs/jskult-webapp/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/aws/__init__.py b/ecs/jskult-webapp/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/aws/aws_api_client.py b/ecs/jskult-webapp/src/aws/aws_api_client.py new file mode 100644 index 00000000..06143bcf --- /dev/null +++ b/ecs/jskult-webapp/src/aws/aws_api_client.py @@ -0,0 +1,5 @@ +from abc import ABCMeta + + +class AWSAPIClient(metaclass=ABCMeta): + pass diff --git a/ecs/jskult-webapp/src/aws/cognito.py b/ecs/jskult-webapp/src/aws/cognito.py new file mode 100644 index 00000000..ee93f7ae --- /dev/null +++ b/ecs/jskult-webapp/src/aws/cognito.py @@ -0,0 +1,25 @@ +import boto3 + +from src.aws.aws_api_client import AWSAPIClient +from src.system_var import environment + + +class CognitoClient(AWSAPIClient): + def __init__(self) -> None: + self.__client = boto3.client('cognito-idp') + + def login_by_user_password_flow(self, username: str, password: str, secret_hash: str): + + auth_response = self.__client.admin_initiate_auth( + UserPoolId=environment.COGNITO_USER_POOL_ID, + ClientId=environment.COGNITO_CLIENT_ID, + AuthFlow='ADMIN_USER_PASSWORD_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + }, + ) + authentication_result = auth_response['AuthenticationResult'] + + return authentication_result['IdToken'], authentication_result['RefreshToken'], diff --git a/ecs/jskult-webapp/src/aws/s3.py b/ecs/jskult-webapp/src/aws/s3.py new file mode 100644 index 00000000..2b6251b1 --- /dev/null +++ b/ecs/jskult-webapp/src/aws/s3.py @@ -0,0 +1,32 @@ +from urllib.parse import quote + +import boto3 + +from src.aws.aws_api_client import AWSAPIClient + + +class S3Client(AWSAPIClient): + __s3_client = boto3.client('s3') + + 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 + ) + + def generate_presigned_url(self, bucket_name: str, file_key: str, download_filename: str = ''): + # presigned_urlを生成 + presigned_url = self.__s3_client.generate_presigned_url( + 'get_object', + Params={ + 'Bucket': bucket_name, + 'Key': file_key, + # 別ファイル名に変更するための仕掛け。Unicode文字はquoteでエスケープが必要 + 'ResponseContentDisposition': f"attachment; filename*=UTF-8''{quote(download_filename)}" + }, + # 有効期限20分 + ExpiresIn=1200 + ) + + return presigned_url diff --git a/ecs/jskult-webapp/src/controller/__init__.py b/ecs/jskult-webapp/src/controller/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py new file mode 100644 index 00000000..fa9f8615 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -0,0 +1,46 @@ +from fastapi import APIRouter, Depends, HTTPException, Request +from starlette import status + +from src.depends.services import get_service +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.system_var import constants +from src.templates import templates + +router = APIRouter() +router.route_class = AuthenticatedRoute +logger = get_logger('生物由来参照') + +######################### +# Views # +######################### + + +@router.get('/BioSearchList') +def bio_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + bio_service: BioViewService = Depends(get_service(BioViewService)) +): + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + logger.debug(f'UserId: {session.user_id}') + # 検索項目の取得 + bio = bio_service.prepare_bio_view(session) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'bioSearchList.html', { + 'request': request, + 'bio': bio, + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/controller/bio_api.py b/ecs/jskult-webapp/src/controller/bio_api.py new file mode 100644 index 00000000..4989a50d --- /dev/null +++ b/ecs/jskult-webapp/src/controller/bio_api.py @@ -0,0 +1,205 @@ +"""生物由来照会 APIRoute""" +import datetime +from typing import Optional, Union + +import pandas as pd +from fastapi import APIRouter, Depends, HTTPException +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from starlette import status + +from src.depends.auth import verify_session +from src.depends.services import get_service +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.request.bio_download import BioDownloadModel +from src.model.view.bio_disp_model import BioDisplayModel +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.services.session_service import set_session +from src.system_var import constants, environment + +logger = get_logger('生物由来参照') + +router = APIRouter() + +######################### +# APIs # +######################### + + +@router.post('/search') +def search_bio_data( + bio_form: Optional[BioModel] = Depends(BioModel.as_form), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + session: Union[UserSession, None] = Depends(verify_session) +): + if session is None: + return JSONResponse(content={'status': 'session_expired'}, status_code=status.HTTP_401_UNAUTHORIZED) + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + return JSONResponse(content={'status': 'batch_processing'}, status_code=status.HTTP_403_FORBIDDEN) + + # 生物由来データと件数を取得 + bio_sales_lot_data = bio_service.search_bio_data(bio_form) + bio_sales_lot_count = bio_service.count_bio_data(bio_form, session) + + # レスポンスデータを加工 + # 日付型のデータのエンコードエラーを解消するための措置 + def custom_encode(obj): + encoded_obj = obj.model_dump() + for key, value in encoded_obj.items(): + if type(value) == datetime.datetime: + encoded_obj[key] = value.strftime("%Y-%m-%d %H:%M:%S") if obj is not None else '' + if type(value) == datetime.date: + encoded_obj[key] = value.strftime("%Y-%m-%d") if obj is not None else '' + return encoded_obj + + data = jsonable_encoder( + bio_sales_lot_data, + custom_encoder={ + BioDisplayModel: custom_encode + } + ) + + # セッション書き換え + session.update( + actions=[ + UserSession.last_access_time.set(UserSession.new_last_access_time()), + UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()), + # 検索結果をキャッシュする + UserSession.bio_search_condition.set(bio_form.model_dump()), + UserSession.bio_search_count.set(bio_sales_lot_count), + ] + ) + set_session(session) + json_response = JSONResponse(content={ + 'data': data, + 'count': bio_sales_lot_count + }) + + # クッキーも書き換え + json_response.set_cookie( + key='session', + value=session.session_key, + secure=True, + httponly=True + ) + return json_response + + +@router.post('/download') +async def download_bio_data( + search_param: BioModel = Depends(BioModel.as_body), + download_param: BioDownloadModel = Depends(BioDownloadModel.as_body), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + session: Union[UserSession, None] = Depends(verify_session) +): + # 通常のビューとはルーティングの扱いを変えるために、個別のルーターで登録する + logger.info('生物由来データダウンロード開始') + logger.info(f'ユーザーID: {download_param.user_id}') + logger.info(f'拡張子: {download_param.ext}') + # ファイル名に使用するタイムスタンプを初期化しておく + current_timestamp = datetime.datetime.now() + # 出力ファイル名 + download_file_name = f'Result_{download_param.user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.{download_param.ext}' + if session is None: + return {'status': 'session_expired'} + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + return {'status': 'batch_processing'} + # 生物由来データを検索 + # 検索に使用したクエリも取得 + search_result_df, query = _search_download_bio_data(bio_service, search_param, download_param) + # アクセスログを記録 + bio_service.write_access_log(query, search_param, download_param.user_id, current_timestamp, download_file_name) + + if search_result_df.size < 1: + # 検索結果が0件の場合、download_urlを返さない + logger.info('検索結果が0件です') + return {'status': 'ok', 'download_url': None} + + # ファイルを書き出し(Excel or CSV) + local_file_path = await _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) + + logger.info('ファイル書き出し完了') + + # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する + try: + bio_service.upload_bio_data_file(local_file_path) + download_file_url = bio_service.generate_download_file_url( + local_file_path, download_param.user_id, download_param.ext) + except Exception as e: + logger.exception(f'S3 アクセスエラー{e}') + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'aws_error', 'message': e.args} + ) + + # セッション書き換え + session.update( + actions=[ + UserSession.last_access_time.set(UserSession.new_last_access_time()), + UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()), + ] + ) + set_session(session) + + # クッキーも書き換え + json_response = JSONResponse(content={ + 'status': 'ok', + 'download_url': download_file_url + }) + + json_response.set_cookie( + key='session', + value=session.session_key, + secure=True, + httponly=True + ) + return json_response + + +def _search_download_bio_data( + bio_service: BioViewService, + search_param: BioModel, + download_param: BioDownloadModel +) -> pd.DataFrame: + try: + # 生物由来データを検索 + # Excelの場合、出力件数を絞る + if download_param.ext == 'xlsx': + search_result_df, query = bio_service.search_download_bio_data( + search_param, limitation=environment.BIO_EXCEL_RESULT_MAX_COUNT) + elif download_param.ext == 'csv': + search_result_df, query = bio_service.search_download_bio_data(search_param) + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + + return search_result_df, query + + +async def _write_bio_data_to_file( + bio_service: BioViewService, + download_param: BioDownloadModel, + df: pd.DataFrame, + download_file_name: str +) -> str: + # 種別によって出力を変える + local_file_path = '' + if download_param.ext == 'xlsx': + logger.info('今回はExcelファイルに出力する') + local_file_path = await bio_service.write_excel_file( + df, download_param.user_id, download_file_name=download_file_name) + elif download_param.ext == 'csv': + logger.info('今回はCSVファイルに出力する') + local_file_path = await bio_service.write_csv_file( + df, download_param.user_id, header=constants.BIO_CSV_HEADER, download_file_name=download_file_name) + + return local_file_path diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py new file mode 100644 index 00000000..cdb8f00e --- /dev/null +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter + +router = APIRouter() + +######################### +# Views # +######################### + + +@router.get('/') +def healthcheck(): + return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py new file mode 100644 index 00000000..5c8d904e --- /dev/null +++ b/ecs/jskult-webapp/src/controller/login.py @@ -0,0 +1,175 @@ +import secrets +import urllib.parse as parse +from typing import Union + +from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi.responses import RedirectResponse +from starlette import status + +from src.depends.auth import code_security +from src.depends.services import get_service +from src.error.exceptions import JWTTokenVerifyException, NotAuthorizeException +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.model.request.login import LoginModel +from src.model.view.mainte_login_view_model import MainteLoginViewModel +from src.router.session_router import AfterSetCookieSessionRoute +from src.services.login_service import LoginService +from src.services.session_service import set_session +from src.system_var import constants, environment +from src.templates import templates + +router = APIRouter() +router.route_class = AfterSetCookieSessionRoute + +logger = get_logger('ログイン') + +######################### +# Views # +######################### + + +@router.get('/userlogin') +def login_user_redirect_view(): + auth_query_string = parse.urlencode( + { + 'response_type': 'code', + 'identity_provider': environment.COGNITO_IDENTITY_PROVIDER, + 'client_id': environment.COGNITO_CLIENT_ID, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + ) + authorize_endpoint_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.AUTHORIZE_ENDPOINT}?{auth_query_string}' + + return RedirectResponse(url=authorize_endpoint_url, status_code=status.HTTP_303_SEE_OTHER) + + +@router.get('/maintlogin') +def login_maintenance_view(request: Request): + mainte_login = MainteLoginViewModel() + return templates.TemplateResponse( + 'maintlogin.html', + { + 'request': request, + 'mainte_login': mainte_login + } + ) + +######################### +# APIs # +######################### + + +@router.post('/maintlogin') +def login( + response: Response, + request: LoginModel = Depends(LoginModel.as_form), + login_service: LoginService = Depends(get_service(LoginService)) +): + try: + jwt_token = login_service.login(request.username, request.password) + except NotAuthorizeException as e: + logger.info(f'ログイン失敗:{e}') + 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) + + verified_token = jwt_token.verify_token() + # 普通の認証だと、`cognito:username`に入る。 + user_id = verified_token.user_id + user_record = login_service.logged_in_user(user_id) + # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする + if user_record is None: + logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # ユーザーが有効ではない場合、ログアウトにリダイレクトする + if not user_record.is_enable_user(): + logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # メンテユーザーではない場合、ログアウトにリダイレクトする + if user_record is None or not user_record.is_maintenance_user(): + logger.info(f'メンテナンスユーザーではない: {user_id}, メンテナンスユーザーフラグ: {user_record.mntuser_flg}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + logger.info(f'メンテナンスユーザー認証成功: {user_id}') + # CSRFトークンを生成 + csrf_token = secrets.token_urlsafe(32) + # DynamoDBにトークンIDを設定する + session_model: UserSession = UserSession.new( + user_id=user_id, + id_token=verified_token.id_token, + refresh_token=verified_token.refresh_token, + csrf_token=csrf_token, + bio_flg=user_record.auth_flg1, + doc_flg=user_record.auth_flg2, + inst_flg=user_record.auth_flg3, + master_mainte_flg=user_record.auth_flg4, + user_flg=user_record.mntuser_flg + ) + session_key = set_session(session_model) + + response = RedirectResponse( + url='/menu/', + status_code=status.HTTP_303_SEE_OTHER, + headers={'session_key': session_key} + ) + + return response + + +@router.get('/authorize') +def sso_authorize( + code: Union[str, None] = Depends(code_security), + login_service: LoginService = Depends(get_service(LoginService)) +) -> Response: + if not code: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_NOT_LOGIN) + + # トークン取得 + jwt_token = login_service.login_with_security_code(code) + try: + # トークン検証 + verified_token = jwt_token.verify_token() + except JWTTokenVerifyException as e: + logger.info(f'SSOログイン失敗:{e}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) + + # トークンからユーザーIDを取得 + user_id = verified_token.user_id + user_record = login_service.logged_in_user(user_id) + + # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする + if user_record is None: + logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # ユーザーが有効ではない場合、ログアウトにリダイレクトする + if not user_record.is_enable_user(): + logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # Merckユーザーではない場合、ログアウトにリダイレクトする + if user_record is None or not user_record.is_groupware_user(): + logger.info(f'メンテナンスユーザーではない: {user_id}, メンテナンスユーザーフラグ: {user_record.mntuser_flg}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + logger.info(f'顧客ユーザー認証成功: {user_id}') + # CSRFトークンを生成 + csrf_token = secrets.token_urlsafe(32) + # DynamoDBにトークンIDを設定する + session_model: UserSession = UserSession.new( + user_id=user_id, + id_token=verified_token.id_token, + refresh_token=verified_token.refresh_token, + csrf_token=csrf_token, + bio_flg=user_record.auth_flg1, + doc_flg=user_record.auth_flg2, + inst_flg=user_record.auth_flg3, + master_mainte_flg=user_record.auth_flg4, + user_flg=user_record.mntuser_flg + ) + session_key = set_session(session_model) + response = RedirectResponse( + url='/menu/', + status_code=status.HTTP_303_SEE_OTHER, + headers={'session_key': session_key} + ) + + return response diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py new file mode 100644 index 00000000..76d9ef60 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -0,0 +1,57 @@ +from typing import Optional, Union + +from fastapi import APIRouter, Depends, Request +from fastapi.responses import HTMLResponse + +from src.depends.auth import get_current_session +from src.model.internal.session import UserSession +from src.model.view.logout_view_model import LogoutViewModel +from src.system_var import constants +from src.templates import templates +from src.services import session_service + +router = APIRouter() + +######################### +# Views # +######################### + + + +@router.get('/', response_class=HTMLResponse) +def logout_view( + request: Request, + reason: Optional[str] = None, + session: Union[UserSession, None] = Depends(get_current_session) +): + # どういうルートでログインしたかを判断するため、refererを取得 + referer = request.headers.get('referer', '') + + redirect_to = '/login/userlogin' + link_text = 'MeDaCA機能メニューへ' + # セッションが切れておらず、メンテユーザである、またはメンテログイン画面から遷移した場合、メンテログイン画面に戻す + if (session is not None and session.user_flg == str(constants.PERMISSION_ENABLED)) \ + or referer.endswith('maintlogin'): + redirect_to = '/login/maintlogin' + link_text = 'Login画面に戻る' + + logout = LogoutViewModel( + redirect_to=redirect_to, + reason=constants.LOGOUT_REASON_MESSAGE_MAP.get(reason, ''), + link_text=link_text + ) + template_response = templates.TemplateResponse( + 'logout.html', + { + 'request': request, + 'logout': logout, + } + ) + # クッキーを削除 + template_response.delete_cookie('session') + + # セッション削除 + if session: + session_service.delete_session(session) + + return template_response diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py new file mode 100644 index 00000000..e9d4ed14 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -0,0 +1,370 @@ +from io import BytesIO, TextIOWrapper +from typing import Optional + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.responses import HTMLResponse +from starlette import status + +from src.depends.services import get_service +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.model.view.inst_emp_csv_download_view_model import \ + InstEmpCsvDownloadViewModel +from src.model.view.inst_emp_csv_upload_view_model import \ + InstEmpCsvUploadViewModel +from src.model.view.master_mainte_menu_view_model import \ + MasterMainteMenuViewModel +from src.model.view.table_override_view_model import TableOverrideViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.login_service import LoginService +from src.services.master_mainte_service import MasterMainteService +from src.system_var import constants +from src.templates import templates + +logger = get_logger('マスターメンテ') + +router = APIRouter() +router.route_class = AuthenticatedRoute + +######################### +# Views # +######################### + + +@router.get('/masterMainteMenu', response_class=HTMLResponse) +def menu_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + menu = MasterMainteMenuViewModel() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'masterMainteMenu.html', + { + 'request': request, + 'menu': menu + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.get('/instEmpCsvUL', response_class=HTMLResponse) +def inst_emp_csv_upload_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + mainte_csv_up = InstEmpCsvUploadViewModel() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instEmpCsvUL.html', + { + 'request': request, + 'mainte_csv_up': mainte_csv_up + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/instEmpCsvUL', response_class=HTMLResponse) +async def inst_emp_csv_upload( + request: Request, + csv_upload_form: MasterMainteCsvUpModel = Depends(MasterMainteCsvUpModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + error_message_list = [] + csv_filename: str = csv_upload_form.csv_file.filename + if csv_upload_form.csv_file.size == 0: + error_message_list.append('選択されたファイルが見つかりませんでした。') + elif not csv_filename.endswith('.csv'): + error_message_list.append('選択されたファイル形式が"csv"ではありません。') + elif csv_upload_form.csv_file.size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: + error_message_list.append('選択されたCSVファイルサイズが大きいです。20MB未満にしてください。') + else: + mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( + TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), + csv_upload_form.csv_file.filename, + csv_upload_form) + + if len(error_message_list) > 0: + mainte_csv_up = InstEmpCsvUploadViewModel( + is_verified=True, + error_message_list=error_message_list, + select_function=csv_upload_form.select_function, + select_table=csv_upload_form.select_table) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instEmpCsvUL.html', + { + 'request': request, + 'mainte_csv_up': mainte_csv_up + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/newInst', response_class=HTMLResponse) +def new_inst_result_view( + request: Request, + csv_upload_form: Optional[MasterMainteCsvUpModel] = Depends(MasterMainteCsvUpModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + login_service: LoginService = Depends(get_service(LoginService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + # ユーザIDからユーザ名を取得 + user_name = login_service.logged_in_user(session.user_id).user_name + # CSVデータを登録し、登録完了画面のモデルを返却する + mainte_csv_up = master_mainte_service.prepare_mainte_new_inst_view(user_name, csv_upload_form) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instEmpCsvUL.html', + { + 'request': request, + 'mainte_csv_up': mainte_csv_up + }, + headers={'session_key': session_key} + ) + return templates_response + + +@ router.get('/instEmpCsvDL', response_class=HTMLResponse) +def inst_emp_csv_download_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + mainte_csv_dl = InstEmpCsvDownloadViewModel( + is_search=False + ) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instEmpCsvDL.html', + { + 'request': request, + 'mainte_csv_dl': mainte_csv_dl + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/download', response_class=HTMLResponse) +def inst_emp_csv_download( + request: Request, + csv_download_form: Optional[MasterMainteCsvDlModel] = Depends(MasterMainteCsvDlModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + search_result_df = master_mainte_service.search_emp_chg_inst_data(csv_download_form) + + (result_msg, download_file_url) = master_mainte_service.upload_emp_chg_inst_data_file( + search_result_df, + session.user_id, + csv_download_form.select_table) + + # 画面表示用のモデル + mainte_csv_dl = InstEmpCsvDownloadViewModel( + is_search=True, + ta_cd=csv_download_form.ta_cd, + inst_cd=csv_download_form.inst_cd, + emp_cd=csv_download_form.emp_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, + end_date_from=csv_download_form.end_date_from, + end_date_to=csv_download_form.end_date_to, + create_date_from=csv_download_form.create_date_from, + create_date_to=csv_download_form.create_date_to, + update_date_from=csv_download_form.update_date_from, + update_date_to=csv_download_form.update_date_to, + select_table=csv_download_form.select_table, + data_count=search_result_df.shape[0], + download_file_url=download_file_url, + file_name=constants.MENTE_CSV_DOWNLOAD_FILE_NAME, + result_msg=result_msg + ) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instEmpCsvDL.html', + { + 'request': request, + 'mainte_csv_dl': mainte_csv_dl + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.get('/tableOverride', response_class=HTMLResponse) +def table_override_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + table_override = TableOverrideViewModel() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'tableOverride.html', + { + 'request': request, + 'table_override': table_override + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/tableOverride', response_class=HTMLResponse) +def table_override_result_view( + request: Request, + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg == constants.PERMISSION_DISABLED: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) + + # バッチ処理中の場合、ログアウトさせる + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, + detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE) + # dump処理中の場合、ログアウトさせる + if batch_status_service.is_dump_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) + + # 画面表示用のモデル + table_override = master_mainte_service.copy_data_real_to_dummy() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'tableOverride.html', + { + 'request': request, + 'table_override': table_override + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py new file mode 100644 index 00000000..aaeb0cf2 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -0,0 +1,56 @@ +from fastapi import APIRouter, Depends, Request +from fastapi.responses import HTMLResponse + +from src.depends.services import get_service +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.model.view.menu_view_model import MenuViewModel +from src.model.view.user_view_model import UserViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.templates import templates + +logger = get_logger('MeDaCA機能メニュー') + +router = APIRouter() +router.route_class = AuthenticatedRoute + +######################### +# Views # +######################### + + +@router.get('/', response_class=HTMLResponse) +def menu_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + # 日付マスターからバッチ情報を取得する + hdke_tbl_record = batch_status_service.hdke_table_record + + batch_status = hdke_tbl_record.bch_actf + dump_status = hdke_tbl_record.dump_sts_kbn + user = UserViewModel( + doc_flg=session.doc_flg, + inst_flg=session.inst_flg, + bio_flg=session.bio_flg, + master_mainte_flg=session.master_mainte_flg + ) + menu = MenuViewModel( + batch_status=batch_status, + dump_status=dump_status, + user_model=user + ) + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'menu.html', + { + 'request': request, + 'menu': menu + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/controller/root.py b/ecs/jskult-webapp/src/controller/root.py new file mode 100644 index 00000000..c02471ca --- /dev/null +++ b/ecs/jskult-webapp/src/controller/root.py @@ -0,0 +1,11 @@ +from fastapi import APIRouter +from fastapi.responses import RedirectResponse +from starlette import status + +router = APIRouter() + + +@router.get('/') +def redirect_to_user_login(): + # ルートパスへのアクセスは、顧客ユーザーログイン画面にリダイレクトさせる + return RedirectResponse(url='/login/userlogin', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py new file mode 100644 index 00000000..6070042f --- /dev/null +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -0,0 +1,298 @@ +from typing import Optional + +from fastapi import APIRouter, Depends, Request + +from src.depends.services import get_service +from src.model.internal.session import UserSession +from src.model.request.ultmarc_doctor import (UltmarcDoctorInfoModel, + UltmarcDoctorSearchModel) +from src.model.request.ultmarc_inst import (UltmarcInstInfoModel, + UltmarcInstSearchModel) +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.ultmarc_view_service import UltmarcViewService +from src.templates import templates + +router = APIRouter() +router.route_class = AuthenticatedRoute + +######################### +# Views # +######################### + +######################### +# アルトマーク施設検索 # +######################### + + +@router.get('/instSearch') +def ultmarc_inst_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 検索項目の取得(都道府県・施設区分) + ultmarc = ultmarc_service.prepare_ultmarc_inst_search_view() + ultmarc.is_batch_processing = is_batch_processing + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/instSearch') +def search_inst( + request: Request, + ultmarc_inst_form: Optional[UltmarcInstSearchModel] = Depends(UltmarcInstSearchModel.as_form), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 施設データを検索 + ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form) + + # 検索項目の取得(都道府県・施設区分) + ultmarc = ultmarc_service.prepare_ultmarc_inst_search_view() + ultmarc.is_batch_processing = is_batch_processing + ultmarc.inst_data = ultmarc_inst_data + # 画面表示用にエスケープを解除して返す + ultmarc.form_data = ultmarc_inst_form.unescape() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + +######################### +# アルトマーク施設詳細 # +######################### + + +@router.get('/instInfo') +def ultmarc_inst_info_view( + request: Request, + id: str, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 施設情報の取得 + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(id) + # バッチ起動判定 + ultmarc.is_batch_processing = is_batch_processing + # inst_id + ultmarc.inst_id = id + # ページ総数(件数) + ultmarc.post_cnt = 1 + # ページ数(表示するページNo) + ultmarc.page_num = 0 + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/instInfo') +def ultmarc_inst_info_search( + request: Request, + ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + inst_id = ultmarc_inst_form.inst_id.split(',') + + # 施設情報の取得 + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(inst_id[ultmarc_inst_form.page_num]) + + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # inst_id + ultmarc.inst_id = ultmarc_inst_form.inst_id + # ページ総数(件数) + ultmarc.post_cnt = len(inst_id) + # ページ数(表示するページNo) + ultmarc.page_num = ultmarc_inst_form.page_num + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'instInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + +######################### +# アルトマーク医師検索 # +######################### + + +@router.get('/docSearch') +def ultmarc_doctor_view( + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 検索項目の取得(都道府県) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_search_view() + ultmarc.is_batch_processing = is_batch_processing + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'docSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/docSearch') +def search_doc( + request: Request, + ultmarc_doctor_form: Optional[UltmarcDoctorSearchModel] = Depends(UltmarcDoctorSearchModel.as_form), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 医師データを検索 + ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form) + + # 検索項目などのデータを取得 + ultmarc = ultmarc_service.prepare_ultmarc_doctor_search_view() + ultmarc.is_batch_processing = is_batch_processing + ultmarc.doctor_data = ultmarc_doctor_data + # 画面表示用にエスケープを解除して返す + ultmarc.form_data = ultmarc_doctor_form.unescape() + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'docSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + +######################### +# アルトマーク医師詳細 # +######################### + + +@router.get('/docInfo') +def ultmarc_doctor_info_view( + request: Request, + id: str, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + # 医師情報の取得 + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(id) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # doc_id + ultmarc.doc_id = id + # ページ総数(件数) + ultmarc.post_cnt = 1 + # ページ数(表示するページNo) + ultmarc.page_num = 0 + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'docInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/docInfo') +def ultmarc_doctor_info_search( + request: Request, + ultmarc_doctor_form: Optional[UltmarcDoctorInfoModel] = Depends(UltmarcDoctorInfoModel.as_form), + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + # バッチ処理中ステータスを取得 + is_batch_processing = batch_status_service.is_batch_processing() + + doc_id = ultmarc_doctor_form.doc_id.split(',') + + # 医師情報の取得 + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(doc_id[ultmarc_doctor_form.page_num]) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # doc_id + ultmarc.doc_id = ultmarc_doctor_form.doc_id + # ページ総数(件数) + ultmarc.post_cnt = len(doc_id) + # ページ数(表示するページNo) + ultmarc.page_num = ultmarc_doctor_form.page_num + + # レスポンス + session_key = session.session_key + templates_response = templates.TemplateResponse( + 'docInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/core/__init__.py b/ecs/jskult-webapp/src/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/core/task.py b/ecs/jskult-webapp/src/core/task.py new file mode 100644 index 00000000..437f3239 --- /dev/null +++ b/ecs/jskult-webapp/src/core/task.py @@ -0,0 +1,12 @@ +"""FastAPIサーバーの起動イベントのラッパー""" + +from typing import Callable + +from src.db.tasks import init_db + + +def create_start_app_handler() -> Callable: + def start_app() -> None: + init_db() + + return start_app diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx new file mode 100644 index 00000000..3b9fb03a Binary files /dev/null and b/ecs/jskult-webapp/src/data/BioData_template.xlsx differ diff --git a/ecs/jskult-webapp/src/db/__init__.py b/ecs/jskult-webapp/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py new file mode 100644 index 00000000..c729faf5 --- /dev/null +++ b/ecs/jskult-webapp/src/db/database.py @@ -0,0 +1,203 @@ +from sqlalchemy import (CursorResult, Engine, NullPool, create_engine, event, + exc, text) +from sqlalchemy.engine.url import URL +from sqlalchemy.orm import Session, sessionmaker +from sqlalchemy.pool import Pool + +from src.db.db_row_generator import DBRowGenerator +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger('DB接続') + + +@event.listens_for(Pool, 'checkout') +def ping_connection(dbapi_connection, connection_record, connection_proxy): + """コネクションが切れた場合、再接続""" + cursor = dbapi_connection.cursor() + try: + cursor.execute("SELECT 1") + except Exception as e: + logger.info(f'DB接続に失敗したため、リトライします: {e}') + # raise DisconnectionError - pool will try + # connecting again up to three times before raising. + raise exc.DisconnectionError() + cursor.close() + + +class DatabaseSession: + """データベースセッション管理クラス""" + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + __instance = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + poolclass=NullPool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + DatabaseSession: DB操作クラスインスタンス + """ + if cls.__instance is None: + cls.__instance = cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + return cls.__instance + + def create_session(self) -> Session: + """ + DBの接続を返します。 + + Returns: + Session: sqlalchemy.orm.Session + """ + try: + return sessionmaker(autoflush=False, bind=self.__engine)() + except Exception as e: + raise DBException(e) + + +class DatabaseClient: + + __session: Session = None + + def __init__(self, session: Session) -> None: + self.__session = session + + @property + def session(self) -> Session: + """ + DBのセッションを返します。 + """ + if self.__session is None: + raise DBException('DBに接続していません') + return self.__session + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + DBRowGenerator: カラム名: 値の辞書リストを返すジェネレータオブジェクト + """ + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.session.in_transaction(): + result = self.session.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(e) + + result_rows = DBRowGenerator(result.mappings()) + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.session.in_transaction(): + result = self.session.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(e) + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.session.in_transaction(): + self.session.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.session.in_transaction(): + self.session.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.session.in_transaction(): + self.session.rollback() + + def disconnect(self): + """DB接続を切断します。""" + self.session.close() + self.__session = None + + def to_jst(self): + self.execute('SET time_zone = "+9:00"') + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.session.begin(): + try: + result = self.session.execute(text(query), parameters) + except Exception as e: + self.session.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-webapp/src/db/db_row_generator.py b/ecs/jskult-webapp/src/db/db_row_generator.py new file mode 100644 index 00000000..f45617b1 --- /dev/null +++ b/ecs/jskult-webapp/src/db/db_row_generator.py @@ -0,0 +1,14 @@ +from sqlalchemy import MappingResult + + +class DBRowGenerator: + """DBの検索結果を指定行数ごとに返すジェネレータ + """ + FETCH_MANY_SIZE = 2000 + + def __init__(self, mapping_result: MappingResult) -> None: + self.mapping_result = mapping_result + + def __iter__(self): + yield_per = self.mapping_result.yield_per(self.FETCH_MANY_SIZE) + yield from yield_per diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py new file mode 100644 index 00000000..d0d645c7 --- /dev/null +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -0,0 +1,36 @@ +class SQLCondition: + column: str + operator: str + param: str + literal: bool + + def __init__(self, column: str, operator: str, param: str, literal=False) -> None: + """ + Args: + column (str): カラム名 + operator (str): 比較演算子 + param (str): パラメータ(プレースホルダーかリテラル値か) + literal (bool, optional): リテラル値を埋め込むかどうか。 + 画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。 + """ + self.column = column + self.operator = operator + self.param = param + self.literal = literal + + def apply(self): + # literalがFalseならプレースホルダー。Trueだったならは固定値。 + param = f':{self.param}' if self.literal is False else self.param + return f' {self.column} {self.operator} {param}' + + +# 定数 +EQ = '=' +NE = '<>' +GT = '>' +LT = '<' +GE = '>=' +LE = '<=' +LIKE = 'LIKE' +IS = 'IS' +IS_NOT = 'IS NOT' diff --git a/ecs/jskult-webapp/src/db/tasks.py b/ecs/jskult-webapp/src/db/tasks.py new file mode 100644 index 00000000..10189beb --- /dev/null +++ b/ecs/jskult-webapp/src/db/tasks.py @@ -0,0 +1,7 @@ +from src.db.database import DatabaseSession + + +def init_db() -> None: + # DB接続モジュールを初期化 + # 以降、get_instance()で唯一のインスタンスを取得する + DatabaseSession.get_instance() diff --git a/ecs/jskult-webapp/src/depends/__init__.py b/ecs/jskult-webapp/src/depends/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/depends/auth.py b/ecs/jskult-webapp/src/depends/auth.py new file mode 100644 index 00000000..7c51d9f8 --- /dev/null +++ b/ecs/jskult-webapp/src/depends/auth.py @@ -0,0 +1,58 @@ +import datetime +from typing import Union + +from fastapi import Depends +from fastapi.security import APIKeyCookie, APIKeyQuery + +from src.error.exceptions import JWTTokenVerifyException +from src.logging.get_logger import get_logger +from src.model.internal.jwt_token import JWTToken +from src.model.internal.session import UserSession +from src.services.session_service import get_session, set_session +from src.system_var import environment + +logger = get_logger('認証チェック') +cookie_security = APIKeyCookie(name='session', auto_error=False) +code_security = APIKeyQuery(name='code', auto_error=False) + + +def get_current_session(session_key=Depends(cookie_security)) -> Union[UserSession, None]: + if session_key is None: + return None + + session = get_session(session_key) + + # sessionが存在しない場合はNoneが返る + return session + + +def check_session_expired(session: Union[UserSession, None] = Depends(get_current_session)) -> Union[UserSession, None]: + """セッションの最後にアクセスした時間が、セッション有効期限切れであるかどうかをチェックする""" + if session is None: + return None + + last_access_time = session.last_access_time + last_access_datetime = datetime.datetime.fromtimestamp(last_access_time) + session_expired_period = last_access_datetime + datetime.timedelta(minutes=environment.SESSION_EXPIRE_MINUTE) + if session_expired_period < datetime.datetime.now(): + return None + + return session + + +def verify_session(session: Union[UserSession, None] = Depends(check_session_expired)) -> Union[UserSession, None]: + if session is None: + return None + jwt_token = JWTToken(session.id_token, session.refresh_token) + try: + verified_token = jwt_token.verify_token() + except JWTTokenVerifyException as e: + logger.info(e) + return None + + # IDトークンがリフレッシュされた場合、セッションに詰め直して更新 + if verified_token.is_refreshed: + session.update(actions=[UserSession.id_token.set(verified_token.id_token)]) + set_session(session) + session.id_token = verified_token.id_token + return session diff --git a/ecs/jskult-webapp/src/depends/database.py b/ecs/jskult-webapp/src/depends/database.py new file mode 100644 index 00000000..3813ca54 --- /dev/null +++ b/ecs/jskult-webapp/src/depends/database.py @@ -0,0 +1,13 @@ +from starlette.requests import Request + +from src.db.database import DatabaseClient, DatabaseSession + + +def get_database(request: Request) -> DatabaseClient: + try: + database_session = DatabaseSession.get_instance() + session = database_session.create_session() + database = DatabaseClient(session) + yield database + finally: + database.disconnect() diff --git a/ecs/jskult-webapp/src/depends/services.py b/ecs/jskult-webapp/src/depends/services.py new file mode 100644 index 00000000..ff071965 --- /dev/null +++ b/ecs/jskult-webapp/src/depends/services.py @@ -0,0 +1,15 @@ +from typing import Callable, Type + +from fastapi import Depends + +from src.db.database import DatabaseClient +from src.depends.database import get_database +from src.services.base_service import BaseService + + +def get_service(Service_type: Type[BaseService]) -> Callable: + def get_service(db: DatabaseClient = Depends(get_database)) -> Type[BaseService]: + repositories = {key: repository(db) for key, repository in Service_type.REPOSITORIES.items()} + clients = {key: client() for key, client in Service_type.CLIENTS.items()} + return Service_type(repositories=repositories, clients=clients) + return get_service diff --git a/ecs/jskult-webapp/src/error/__init__.py b/ecs/jskult-webapp/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/error/exception_handler.py b/ecs/jskult-webapp/src/error/exception_handler.py new file mode 100644 index 00000000..1b8cb59c --- /dev/null +++ b/ecs/jskult-webapp/src/error/exception_handler.py @@ -0,0 +1,15 @@ +from urllib import parse + +from fastapi import Request +from fastapi.exceptions import HTTPException +from fastapi.responses import RedirectResponse +from starlette import status + + +def http_exception_handler(request: Request, exc: HTTPException): + # 非同期API呼び出しの場合、detailにdictが入ってくるため、そのまま流す + if hasattr(exc, 'detail') is True and type(exc.detail) == dict: + raise exc + error_detail = exc.detail if hasattr(exc, 'detail') else '' + reason = parse.quote(error_detail) + return RedirectResponse(f'/logout/?reason={reason}', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/error/exceptions.py b/ecs/jskult-webapp/src/error/exceptions.py new file mode 100644 index 00000000..4e73515c --- /dev/null +++ b/ecs/jskult-webapp/src/error/exceptions.py @@ -0,0 +1,37 @@ +from typing import Union + +from starlette import status + + +class MeDaCaException(Exception): + """Webアプリの共通例外""" + pass + + +class NotAuthorizeException(MeDaCaException): + """認証失敗の例外""" + pass + + +class JWTTokenVerifyException(MeDaCaException): + """トークン検証失敗の例外""" + pass + + +class DBException(MeDaCaException): + """DB関連の例外""" + pass + + +class UnexpectedException(MeDaCaException): + """予期しない例外""" + + # デフォルトを500エラーとする + default_status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + + def __init__( + self, + detail: Union[str, dict], + ) -> None: + self.status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + self.detail = detail diff --git a/ecs/jskult-webapp/src/logging/get_logger.py b/ecs/jskult-webapp/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-webapp/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py new file mode 100644 index 00000000..f0e1807d --- /dev/null +++ b/ecs/jskult-webapp/src/main.py @@ -0,0 +1,50 @@ +import os.path as path + +from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles +from starlette import status + +import src.static as static +from src.controller import (bio, bio_api, healthcheck, login, logout, + master_mainte, menu, root, ultmarc) +from src.core import task +from src.error.exception_handler import http_exception_handler +from src.error.exceptions import UnexpectedException +from src.middleware.middleware import SecurityHeadersMiddleware + +app = FastAPI(openapi_url=None) + +# 静的ファイルをマウント +app.mount('/static', StaticFiles(directory=path.dirname(static.__file__)), name='static') +# ルートパス。顧客ログイン画面にリダイレクトさせる +app.include_router(root.router) +# ログイン関連のルーター +app.include_router(login.router, prefix='/login') +# ログアウト関連のルーター +app.include_router(logout.router, prefix='/logout') +# メニュー画面関連のルーター +app.include_router(menu.router, prefix='/menu') +# 生物由来関連のルーター +app.include_router(bio.router, prefix='/bio') +# アルトマークデータ照会のルーター +app.include_router(ultmarc.router, prefix='/ultmarc') +# 生物由来照会のAPIルーター。 +# クライアントから非同期呼出しされるため、共通ルーターとは異なる扱いとする。 +app.include_router(bio_api.router, prefix='/bio') +# マスタメンテ +app.include_router(master_mainte.router, prefix='/masterMainte') +# ヘルスチェック用のルーター +app.include_router(healthcheck.router, prefix='/healthcheck') + +# エラー発生時にログアウト画面に遷移させるハンドラー +app.add_exception_handler(status.HTTP_401_UNAUTHORIZED, http_exception_handler) +app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) + +# サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 +app.add_exception_handler(UnexpectedException, http_exception_handler) + +# セキュリティヘッダー設定はミドルウェアで処理する +app.add_middleware(SecurityHeadersMiddleware) + +# サーバー起動時のイベント +app.add_event_handler('startup', task.create_start_app_handler()) diff --git a/ecs/jskult-webapp/src/middleware/__init__.py b/ecs/jskult-webapp/src/middleware/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/middleware/middleware.py b/ecs/jskult-webapp/src/middleware/middleware.py new file mode 100644 index 00000000..264fd190 --- /dev/null +++ b/ecs/jskult-webapp/src/middleware/middleware.py @@ -0,0 +1,16 @@ +from fastapi import Request, Response, status +from fastapi.responses import JSONResponse +from starlette.middleware.base import BaseHTTPMiddleware + +class SecurityHeadersMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request, call_next): + response = await call_next(request) + # X-Frame-Optionsヘッダー追加 + response.headers['X-Frame-Options'] = 'DENY' + # X-Content-Type-Optionsヘッダー追加 + response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + response.headers['Cache-Control'] = 'private' + return response diff --git a/ecs/jskult-webapp/src/model/__init__.py b/ecs/jskult-webapp/src/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/db/__init__.py b/ecs/jskult-webapp/src/model/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/db/base_db_model.py b/ecs/jskult-webapp/src/model/db/base_db_model.py new file mode 100644 index 00000000..0f817d91 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/base_db_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class BaseDBModel(BaseModel): + pass diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_lot.py b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py new file mode 100644 index 00000000..f3e36951 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py @@ -0,0 +1,48 @@ +from datetime import date, datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class BioSalesLotDBModel(BaseDBModel): + slip_mgt_num: Optional[str] + rec_whs_cd: Optional[str] + rec_whs_sub_cd: Optional[str] + rec_whs_org_cd: Optional[str] + rec_comm_cd: Optional[str] + rec_tran_kbn: Optional[str] + rev_hsdnymd_srk: Optional[str] + rec_urag_num: Optional[str] + rec_nonyu_fcl_name: Optional[str] + rec_nonyu_fcl_addr: Optional[str] + rec_lot_num: Optional[str] + rec_ymd: Optional[str] + v_tran_cd: Optional[int] + tran_kbn_name: Optional[str] + v_whsorg_cd: Optional[int] + whs_org_name: Optional[str] + v_whs_cd: Optional[int] + whs_name: Optional[str] + nonyu_fcl_cd: Optional[str] + product_name: Optional[str] + whs_rep_comm_name: Optional[str] + whs_rep_nonyu_fcl_name: Optional[str] + whs_rep_nonyu_fcl_addr: Optional[str] + mkr_cd: Optional[str] + qty: Optional[int] + bef_slip_mgt_num: Optional[str] + iko_flg: Optional[str] + ins_dt: Optional[datetime] + ins_usr: Optional[str] + inst_cd: Optional[str] + inst_name_form: Optional[str] + address: Optional[str] + tel_num: Optional[str] + data_kbn: Optional[str] + data_kind: Optional[str] + err_dtl_kind: Optional[str] + expr_dt: Optional[date] + + +class BioSalesLotCountDBModel(BaseDBModel): + count: Optional[int] diff --git a/ecs/jskult-webapp/src/model/db/hdke_tbl.py b/ecs/jskult-webapp/src/model/db/hdke_tbl.py new file mode 100644 index 00000000..9655c6c1 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/hdke_tbl.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class HdkeTblModel(BaseDBModel): + bch_actf: Optional[str] + dump_sts_kbn: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/inst_div_master.py b/ecs/jskult-webapp/src/model/db/inst_div_master.py new file mode 100644 index 00000000..38ec7b70 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/inst_div_master.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class InstDivMasterModel(BaseDBModel): + inst_div_cd: Optional[str] + inst_div_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/master_mente_count.py b/ecs/jskult-webapp/src/model/db/master_mente_count.py new file mode 100644 index 00000000..a3837819 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/master_mente_count.py @@ -0,0 +1,9 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class MasterMenteCountModel(BaseDBModel): + count: Optional[int] diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py new file mode 100644 index 00000000..35181012 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class PharmacyProductMasterModel(BaseDBModel): + mkr_cd: Optional[str] + mkr_cd_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/prefc_master.py b/ecs/jskult-webapp/src/model/db/prefc_master.py new file mode 100644 index 00000000..5010149e --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/prefc_master.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class PrefcMasterModel(BaseDBModel): + prefc_cd: Optional[str] + prefc_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py new file mode 100644 index 00000000..16b120c0 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py @@ -0,0 +1,20 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorDBModel(BaseDBModel): + dcf_pcf_dr_cd: Optional[str] + dr_name: Optional[str] + form_inst_name_kanji: Optional[str] + dcf_dsf_inst_cd: Optional[str] + blng_sec_name: Optional[str] + trt_course_name: Optional[str] + form_post_name: Optional[str] + alma: Optional[str] + grad_y: Optional[str] + use_stop_div: Optional[str] + prefc_name: Optional[str] + blng_sec_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py new file mode 100644 index 00000000..7999de13 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py @@ -0,0 +1,19 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorInfoDBModel(BaseDBModel): + dcf_pcf_dr_cd: Optional[str] + dr_name: Optional[str] + dr_name_kana: Optional[str] + sex: Optional[str] + birthday: Optional[str] + alma: Optional[str] + hometown: Optional[str] + grad_y: Optional[str] + use_stop_div: Optional[str] + drday_y: Optional[str] + estab_y: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py new file mode 100644 index 00000000..103cd9f1 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py @@ -0,0 +1,14 @@ +from datetime import date +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class UltmarcDoctorWrkplaceDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + inst_name_kanji: Optional[str] + blng_sec_name: Optional[str] + univ_post_name: Optional[str] + post_name: Optional[str] + aply_start_ymd: Optional[date] + notdm_flg: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py new file mode 100644 index 00000000..4482eab9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py @@ -0,0 +1,9 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorWrkplaceCountDBModel(BaseDBModel): + count: Optional[int] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py new file mode 100644 index 00000000..04450f9a --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py @@ -0,0 +1,14 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class UltmarcDoctorWrkplaceHisDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + inst_name_kanji: Optional[str] + blng_sec_name: Optional[str] + univ_post_name: Optional[str] + post_name: Optional[str] + aply_start_ymd: Optional[str] + aply_end_ymd: Optional[str] + notdm_flg: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst.py new file mode 100644 index 00000000..14830582 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst.py @@ -0,0 +1,18 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcInstDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + abolish_ymd: Optional[str] + delete_sche_reason_cd: Optional[str] + form_inst_name_kanji: Optional[str] + inst_addr: Optional[str] + postal_number: Optional[str] + inst_phone_number: Optional[str] + inst_div_name: Optional[str] + hp_assrt_name: Optional[str] + prefc_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py new file mode 100644 index 00000000..1d25bce5 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py @@ -0,0 +1,56 @@ +from datetime import datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class UltmarcInstInfoDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + unconf_flg: Optional[str] + dup_opp_cd: Optional[str] + close_start_ym: Optional[str] + close_flg: Optional[str] + delete_sche_reason_cd: Optional[str] + abolish_ymd: Optional[str] + estab_sche_ym: Optional[str] + estab_sche_flg: Optional[str] + form_inst_name_kana: Optional[str] + form_inst_name_kanji: Optional[str] + inst_name_kana: Optional[str] + inst_name_kanji: Optional[str] + manage_cd: Optional[str] + postal_number: Optional[str] + inst_phone_number: Optional[str] + addr_unknown_reason_cd: Optional[str] + phone_number_non_flg: Optional[str] + inst_addr_kana: Optional[str] + inst_addr: Optional[str] + re_exam_cd: Optional[str] + rltd_univ_prnt_cd: Optional[str] + insp_item_micrb: Optional[str] + insp_item_serum: Optional[str] + insp_item_blood: Optional[str] + insp_item_patho: Optional[str] + insp_item_paras: Optional[str] + insp_item_biochem: Optional[str] + insp_item_ri: Optional[str] + prmit_bed_num_gen: Optional[int] + prmit_bed_num_rcup: Optional[int] + prmit_bed_num_mental: Optional[int] + prmit_bed_num_infection: Optional[int] + prmit_bed_num_tuber: Optional[int] + prmit_bed_num_other: Optional[int] + prmit_bed_num_sum: Optional[int] + ward_abolish_flg: Optional[str] + bed_num: Optional[int] + prmit_bed_maint_ymd: Optional[str] + inst_repre_cd: Optional[str] + inst_repre_kana: Optional[str] + inst_repre: Optional[str] + sys_update_date: Optional[datetime] + delete_sche_reason: Optional[str] + inst_div_name: Optional[str] + manage_name: Optional[str] + hp_assrt_name: Optional[str] + parent_name: Optional[str] + dcf_prnt_inst_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py new file mode 100644 index 00000000..7c2ef6de --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py @@ -0,0 +1,9 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcInstTrtCourseDBModel(BaseDBModel): + trt_course_name_abb: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py b/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py new file mode 100644 index 00000000..ab76e4db --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py @@ -0,0 +1,10 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcSosietyDBModel(BaseDBModel): + sosiety_cd: Optional[str] + sosiety_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py b/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py new file mode 100644 index 00000000..8cccb4eb --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py @@ -0,0 +1,10 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcSpecialistLicenseDBModel(BaseDBModel): + specialist_cd: Optional[str] + specialist_license_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py new file mode 100644 index 00000000..12ced11c --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py @@ -0,0 +1,9 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDrTrtCourseDBModel(BaseDBModel): + trt_course_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py new file mode 100644 index 00000000..913b415e --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -0,0 +1,36 @@ +from datetime import datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class UserMasterModel(BaseDBModel): + user_id: Optional[str] + mail_adr: Optional[str] + user_name: Optional[str] + auth_flg1: Optional[int] + auth_flg2: Optional[int] + auth_flg3: Optional[int] + auth_flg4: Optional[int] + auth_flg5: Optional[int] + auth_flg6: Optional[int] + auth_flg7: Optional[int] + auth_flg8: Optional[int] + auth_flg9: Optional[int] + auth_flg10: Optional[int] + pwd: Optional[str] + enabled_flg: Optional[str] + creater: Optional[str] + create_date: Optional[datetime] + updater: Optional[str] + update_date: Optional[datetime] + mntuser_flg: Optional[str] + + def is_enable_user(self): + return self.enabled_flg == 'Y' + + def is_maintenance_user(self): + return self.mntuser_flg == '1' + + def is_groupware_user(self): + return self.mntuser_flg == '0' or self.mntuser_flg is None diff --git a/ecs/jskult-webapp/src/model/db/wholesaler_master.py b/ecs/jskult-webapp/src/model/db/wholesaler_master.py new file mode 100644 index 00000000..b24f58b7 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/wholesaler_master.py @@ -0,0 +1,10 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class WholesalerMasterModel(BaseDBModel): + rec_whs_cd: Optional[str] + rec_whs_sub_cd: Optional[str] + name: Optional[str] + whs_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/internal/jwt_token.py b/ecs/jskult-webapp/src/model/internal/jwt_token.py new file mode 100644 index 00000000..1f5a6cf7 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/jwt_token.py @@ -0,0 +1,160 @@ +import base64 +import json +from typing import Optional + +import jwt +import requests +from starlette import status + +from src.error.exceptions import JWTTokenVerifyException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger('JWTトークン検証') + + +class JWTToken: + id_token: str + refresh_token: str + verified_jwt: Optional[dict] + is_refreshed: Optional[bool] + + def __init__(self, id_token: str, refresh_token: str, verified_jwt: dict = None, is_refreshed: bool = False): + self.id_token = id_token + self.refresh_token = refresh_token + self.verified_jwt = verified_jwt + self.is_refreshed = is_refreshed + + @property + def verified_token(self): + if self.verified_jwt is None: + raise JWTTokenVerifyException('検証されていないトークン') + return self.verified_jwt + + @property + def user_id(self): + verified_token = self.verified_token + + user_id: str = None + identities: dict = verified_token.get('identities') + if identities is not None: + # 一般ユーザーログインによる(SSO経由) + user_id = identities[0]['userId'] + # <社員番号>@<ドメイン名>となっているため、@で分割 + user_id = user_id.split('@')[0] + else: + # メンテユーザーによるログイン + user_id = verified_token.get('cognito:username') + + return user_id + + @classmethod + def request(cls, code: str): + """JWTをリクエストし、新たなインスタンスを返す + + Args: + code (str): セキュリティコード + + Raises: + JWTTokenVerifyException: 認証失敗 + + Returns: + JWTToken: JWTTokenのモデルクラス + """ + token_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.TOKEN_ENDPOINT}' + request_params = { + 'grant_type': 'authorization_code', + 'client_id': environment.COGNITO_CLIENT_ID, + 'code': code, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') + auth_header_value = base64.b64encode(message).decode() + request_headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {auth_header_value}' + } + + res = requests.post(token_url, params=request_params, headers=request_headers) + if res.status_code != status.HTTP_200_OK: + raise JWTTokenVerifyException(res.text) + + token_response = json.loads(res.text) + + return cls(id_token=token_response['id_token'], refresh_token=token_response['refresh_token']) + + @classmethod + def refresh(cls, refresh_token: str): + """JWTをリフレッシュし、新たなインスタンスを返す + + Args: + refresh_token (str): リフレッシュトークン + + Raises: + JWTTokenVerifyException: 認証失敗 + + Returns: + JWTToken: JWTTokenのモデルクラス + """ + token_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.TOKEN_ENDPOINT}' + request_params = { + 'grant_type': 'refresh_token', + 'client_id': environment.COGNITO_CLIENT_ID, + 'refresh_token': refresh_token, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') + auth_header_value = base64.b64encode(message).decode() + request_headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {auth_header_value}' + } + + res = requests.post(token_url, params=request_params, headers=request_headers) + if res.status_code != status.HTTP_200_OK: + raise JWTTokenVerifyException(res.text) + + token_response = json.loads(res.text) + return cls(id_token=token_response['id_token'], refresh_token=refresh_token) + + def verify_token(self, is_refreshed=False): + if self.id_token is None: + raise Exception('アクセストークンがない') + + issuer = f'https://cognito-idp.{environment.AWS_REGION}.amazonaws.com/{environment.COGNITO_USER_POOL_ID}' + jwks_url = f'{issuer}/.well-known/jwks.json' + + jwks_client = jwt.PyJWKClient(jwks_url) + signing_key = jwks_client.get_signing_key_from_jwt(self.id_token) + + try: + verified_jwt = jwt.decode( + self.id_token, + signing_key.key, + algorithms=['RS256'], + audience=environment.COGNITO_CLIENT_ID, + issuer=issuer, + # Cognitoのサーバー時間とのズレにより、Issued atクレームの検証に失敗するパターンに対処する + options={'verify_iat': False} + ) + # 有効期限(exp)が切れた場合、トークンをリフレッシュする + except jwt.ExpiredSignatureError: + logger.info('IDトークンの有効期限が切れたため、トークンをリフレッシュ') + refreshed_jwt_token = JWTToken.refresh(self.refresh_token) + # リフレッシュ後のトークンを再度検証 + return refreshed_jwt_token.verify_token(is_refreshed=True) + # 有効期限以外の検証に失敗した場合は例外とする + except jwt.InvalidTokenError as e: + raise JWTTokenVerifyException('Invalid token', e) + # IDトークンを使用していることを検証する + if verified_jwt['token_use'] != 'id': + raise JWTTokenVerifyException('Invalid `token_use` claim, should be `id`.') + + return JWTToken( + id_token=self.id_token, + refresh_token=self.refresh_token, + verified_jwt=verified_jwt, + is_refreshed=is_refreshed + ) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py new file mode 100644 index 00000000..e288ce3a --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -0,0 +1,572 @@ +import csv +import json + +from io import TextIOWrapper +from datetime import datetime +from abc import ABCMeta, abstractmethod +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.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') + + +class MasterMainteCSVItem(metaclass=ABCMeta): + + csv_row: list[str] + table_name: str + line_num: str + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository + + def __init__( + self, + csv_row: list[str], + table_name: str, + line_num: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository + ): + self.csv_row = csv_row + self.table_name = table_name + self.line_num = line_num + self.mst_inst_repository = mst_inst_repository + self.emp_master_repository = emp_master_repository + self.bu_master_repository = bu_master_repository + self.emp_chginst_repository = emp_chginst_repository + + def validate(self) -> list[str]: + """ + 項目のバリデーションを行うテンプレートメソッド\n + 各チェックロジックはサブクラスで実装する + エラーが有る場合、[行数、項目名: エラー内容]のリストを返す + """ + error_list = [] + # 項目数チェック + error_list.extend(self.check_item_count()) + if len(error_list) == 0: + # 必須チェック 及び コメントエラーチェック + error_list.extend(self.check_require()) + # 施設コード存在チェック + error_list.extend(self.check_inst_cd_exists()) + # MUID存在チェック + error_list.extend(self.check_emp_cd_exists()) + # BuCd存在チェック + error_list.extend(self.check_bu_cd_exists()) + # 適用開始日 < 適用終了日、実在日チェック + error_list.extend(self.check_existing_date()) + # データ存在チェック + error_list.extend(self.check_data_exists()) + + # エラーのないリストを省いて返す + error_list = [error for error in error_list if len(error) != 0] + return error_list + + def check_csv_item_count(self, item_count: int) -> list[str]: + error_list = [] + + if not len(self.csv_row) == item_count: + error_list.append(f'{self.line_num}行目の項目数が一致しません。項目数を確認してください。') + + return error_list + + def emp_chg_inst_count(self, start_date: str): + return self.emp_chginst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, self.table_name) + + def is_exist_emp_cd(self, start_date: str) -> bool: + if start_date is None or len(start_date) == 0: + return False + if self.emp_master_repository.fetch_count(self.emp_cd, start_date) == 0: + return True + return False + + def is_exist_inst_cd(self) -> bool: + return True if self.mst_inst_repository.fetch_count(self.inst_cd) > 0 else False + + def is_exist_bu_cd(self) -> bool: + return True if self.bu_master_repository.fetch_count(self.bu_cd) > 0 else False + + def make_require_error_message(self, line_num: str, col_name: str) -> str: + return f'{line_num}行目の{col_name}が入力されておりません。' + + def __parse_str_to_date(self, check_date: str) -> tuple[bool, datetime]: + try: + check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') + except Exception as e: + logger.debug(f'適用期間の日付が不正{e}') + return (False, None) + + try: + reverse_check_date: str = check_date_time.strftime('%Y%m%d') + except Exception as e: + logger.debug(f'適用期間の日付が不正{e}') + return (False, None) + + if check_date != reverse_check_date: + return (False, None) + + return (True, check_date_time) + + def check_term_date(self, + start_date: str, + end_date: str, + start_date_col_name: str, + end_date_col_name: str) -> tuple[list[str], datetime, datetime]: + error_list = [] + + start_date_time: datetime = None + end_date_time: datetime = None + if is_not_empty(start_date): + (result, start_date_time) = self.__parse_str_to_date(start_date) + if result is False: + error_list.append(f'{self.line_num}行目の{start_date_col_name}が実在しない日付になっています。') + if is_not_empty(end_date): + (result, end_date_time) = self.__parse_str_to_date(end_date) + if result is False: + error_list.append(f'{self.line_num}行目の{end_date_col_name}が実在しない日付になっています。') + + return (error_list, start_date_time, end_date_time) + + def get_csv_value(self, column_no: int): + try: + column_value = self.csv_row[column_no] + except IndexError: + column_value = '' + + return column_value + + @abstractmethod + def csv_row_data(self) -> dict: + pass + ... + + @abstractmethod + def check_require(self) -> list[str]: + """必須チェック""" + pass + ... + + @abstractmethod + def check_inst_cd_exists(self) -> list[str]: + """InstCD存在チェック""" + pass + ... + + @abstractmethod + def check_emp_cd_exists(self) -> list[str]: + """MUID存在チェック""" + pass + ... + + @abstractmethod + def check_bu_cd_exists(self) -> list[str]: + """BuCd存在チェック""" + pass + ... + + @abstractmethod + def check_existing_date(self) -> list[str]: + """適用開始日 < 適用終了日、実在日チェック""" + + @abstractmethod + def check_item_count(self) -> list[str]: + """項目数チェック""" + pass + ... + + @abstractmethod + def check_data_exists(self) -> list[str]: + """データ存在チェック""" + pass + ... + + +class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): + """新規施設担当者登録CSV""" + inst_name: str + emp_name_family: str + emp_name_first: str + start_date: str + end_date: str + + def __init__( + self, + csv_row: list[str], + table_name: str, + line_num: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository + ): + super().__init__( + csv_row, + table_name, + line_num, + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_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) + self.ta_cd = super().get_csv_value(constants.CSV_NEW_TA_CD_COL_NO) + self.emp_cd = super().get_csv_value(constants.CSV_NEW_EMP_CD_COL_NO) + self.emp_name_family = super().get_csv_value(constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO) + self.emp_name_first = super().get_csv_value(constants.CSV_NEW_EMP_NAME_FIRST_COL_NO) + self.bu_cd = super().get_csv_value(constants.CSV_NEW_BU_CD_COL_NO) + self.start_date = super().get_csv_value(constants.CSV_NEW_START_DATE) + self.end_date = super().get_csv_value(constants.CSV_NEW_END_DATE) + + def csv_row_data(self) -> dict: + return {constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} + + def check_require(self) -> list[str]: + error_list = [] + if len(self.inst_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO])) + 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.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])) + if len(self.start_date) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE])) + if len(self.end_date) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE])) + + return error_list + + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if is_not_empty(self.inst_cd) and super().is_exist_inst_cd() is False: + error_list.append( + f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') + return error_list + + def check_emp_cd_exists(self) -> list[str]: + error_list = [] + if not self.start_date or not self.emp_cd: + return error_list + + if super().is_exist_emp_cd(self.start_date) is True: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + + def check_bu_cd_exists(self) -> list[str]: + error_list = [] + + if is_not_empty(self.bu_cd) and super().is_exist_bu_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + if not self.start_date or not self.end_date: + return error_list + + (error_list, start_date_time, end_date_time) = super().check_term_date( + self.start_date, + self.end_date, + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE], + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]) + if len(error_list) > 0: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE]}\ +が{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]}よりも後の日付になっています。') + return error_list + + def check_item_count(self) -> list[str]: + return super().check_csv_item_count(len(constants.NEW_INST_EMP_CSV_LOGICAL_NAMES)) + + 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}行目の施設コード、領域コード、適用開始日がすべて同一のデータが既に登録されています。') + + return error_list + + +class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): + """施設担当者変更登録CSV""" + bu_name: str + org_cd: str + org_short_name: str + inst_name: str + explain: str + emp_full_name: str + inst_emp_start_date: str + inst_emp_end_date: str + change_end_date: str + comment: str + + def __init__( + self, + csv_row: list[str], + table_name: str, + line_num: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository + ): + super().__init__( + csv_row, + table_name, + line_num, + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_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) + self.org_cd = super().get_csv_value(constants.CSV_CHANGE_ORG_CD_COL_NO) + self.org_short_name = super().get_csv_value(constants.CSV_CHANGE_ORG_SHORT_NAME_COL_NO) + self.inst_cd = super().get_csv_value(constants.CSV_CHANGE_INST_CD_COL_NO) + self.inst_name = super().get_csv_value(constants.CSV_CHANGE_INST_NAME_COL_NO) + self.ta_cd = super().get_csv_value(constants.CSV_CHANGE_TA_CD_COL_NO) + self.explain = super().get_csv_value(constants.CSV_CHANGE_EXPLAIN_COL_NO) + self.emp_cd = super().get_csv_value(constants.CSV_CHANGE_EMP_CD_COL_NO) + self.emp_full_name = super().get_csv_value(constants.CSV_CHANGE_EMP_FULL_NAME_COL_NO) + self.inst_emp_start_date = super().get_csv_value(constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO) + self.inst_emp_end_date = super().get_csv_value(constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO) + self.change_end_date = super().get_csv_value(constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO) + self.comment = super().get_csv_value(constants.CSV_CHANGE_COMMENT) + + def csv_row_data(self) -> dict: + return {constants.CHANGE_INST_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} + + def check_require(self) -> list[str]: + error_list = [] + if self.comment == '追加': + if len(self.bu_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO])) + if len(self.inst_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) + 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_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])) + if len(self.inst_emp_start_date) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + if len(self.inst_emp_end_date) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) + elif self.comment == '終了': + if len(self.inst_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) + 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.inst_emp_start_date) == 0: + error_list.append(self.make_require_error_message( + self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + if len(self.change_end_date) == 0: + error_list.append(self.make_require_error_message(self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO])) + elif self.comment == '担当者修正': + if len(self.inst_cd) == 0: + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) + 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_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])) + if len(self.inst_emp_start_date) == 0: + error_list.append(self.make_require_error_message(self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + else: + error_list.append(f'{self.line_num}行目のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。') + return error_list + + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if is_not_empty(self.inst_cd) and super().is_exist_inst_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') + return error_list + + def check_emp_cd_exists(self) -> list[str]: + error_list = [] + if not self.inst_emp_start_date or not self.emp_cd: + return error_list + + if self.comment != '追加' and self.comment != '担当者修正': + return error_list + + if super().is_exist_emp_cd(self.inst_emp_start_date) is True: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + + def check_bu_cd_exists(self) -> list[str]: + error_list = [] + + if is_not_empty(self.bu_cd) and self.comment == '追加'\ + and super().is_exist_bu_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + start_date = self.inst_emp_start_date + if self.comment == '追加' or self.comment == '終了': + if self.comment == '追加': + end_date = self.inst_emp_end_date + end_date_col_name = constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が\ +{end_date_col_name}よりも後の日付になっています。' + else: + end_date = self.change_end_date + end_date_col_name = constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が\ +{end_date_col_name}よりも後の日付になっています。' + + if not start_date or not end_date: + return error_list + + (error_list, start_date_time, end_date_time) = super().check_term_date( + start_date, + end_date, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + end_date_col_name) + if len(error_list) > 0: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{compare_error_message}') + return error_list + + def check_item_count(self) -> list[str]: + return super().check_csv_item_count(len(constants.CHANGE_INST_CSV_LOGICAL_NAMES)) + + def check_data_exists(self) -> list[str]: + 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}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが既に登録されています。') + + elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: + error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') + + return error_list + + +class MasterMainteCSVItems: + """施設担当者CSVをループで回すためのもの""" + lines: list[MasterMainteCSVItem] + __i: int = 0 + + def to_json(self): + # CSVをjsonに変換 + csv_row_dict_list: list[dict] = self.to_dict() + + # json作成 + return json.dumps(csv_row_dict_list, ensure_ascii=False) + + def to_dict(self): + return [row_item.csv_row_data() for row_item in self.lines] + + def __iter__(self): + return self + + def __next__(self) -> MasterMainteCSVItem: + if self.__i == len(self.lines): + raise StopIteration() + line = self.lines[self.__i] + self.__i += 1 + return line + + def __init__( + self, + file: TextIOWrapper, + select_function: str, + table_name: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository + ) -> None: + reader = csv.reader(file) + csv_rows = [] + for line_num, row in enumerate(reader, start=0): + if line_num == 0: + continue + csv_rows.append(self.__select_function( + select_function, + row, + table_name, + line_num, + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository)) + self.lines = csv_rows + + def __select_function(self, + function_type: str, + row: list[str], + table_name: str, + line_num: int, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository) -> MasterMainteCSVItem: + if function_type == 'new': + return MasterMainteNewInstEmpCSVItem( + row, + table_name, + str(line_num), + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) + elif function_type == 'change': + return MasterMainteChangeInstEmpCSVItem( + row, + table_name, + str(line_num), + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py new file mode 100644 index 00000000..18a5cb0c --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py @@ -0,0 +1,163 @@ +from abc import ABCMeta, abstractmethod +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') + + +class MasterMainteEmpChgInstFunction(metaclass=ABCMeta): + insert_data: list[dict] + table_name: str + select_table_message: str + user_name: str + emp_chginst_repository: EmpChgInstRepository + + def __init__( + self, + insert_data, + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + self.insert_data = insert_data + self.table_name = table_name + self.select_table_message = select_table_message + self.user_name = user_name + self.emp_chginst_repository = emp_chginst_repository + + def save(self): + error_list = [] + try: + self.emp_chginst_repository.to_jst() + self.emp_chginst_repository.begin() + (result_message, error_list) = self.write_emp_chg_inst_table() + if len(error_list) > 0: + self.emp_chginst_repository.rollback() + else: + self.emp_chginst_repository.commit() + except Exception as e: + self.emp_chginst_repository.rollback() + raise e + + return (result_message, error_list) + + def add_emp_chg_inst_table(self, data, start_date, end_date): + self.emp_chginst_repository.insert_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['MUID'], + data['ビジネスユニットコード'], + start_date, + end_date, + self.user_name, + self.table_name) + + @abstractmethod + def write_emp_chg_inst_table(self): + pass + + +class NewEmpChgInstFunction(MasterMainteEmpChgInstFunction): + + def __init__( + self, + insert_data_list: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + super().__init__( + insert_data_list, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + error_list = [] + + add_count = 0 + for row_no, data in enumerate(self.insert_data, start=1): + try: + self.add_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) + add_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。CSVファイルを確認してください。') + logger.info(f'新規施設登録時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('新規施設登録を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + return (result_message_list, error_list) + + +class ChangeEmpChgInstFunction(MasterMainteEmpChgInstFunction): + + def __init__( + self, + insert_data: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + + ): + super().__init__( + insert_data, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + add_count = 0 + end_count = 0 + modify_count = 0 + error_list = [] + for row_no, data in enumerate(self.insert_data, start=1): + try: + if data['コメント'] == '追加': + self.add_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) + add_count += 1 + elif data['コメント'] == '終了': + self.__end_emp_chg_inst(data) + end_count += 1 + elif data['コメント'] == '担当者修正': + self.__modify_emp_chg_inst(data) + modify_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。CSVファイルを確認してください。') + logger.info(f'施設担当者変更時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('施設担当者変更を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + result_message_list.append('修正:' + str(modify_count) + '件') + result_message_list.append('終了:' + str(end_count) + '件') + return (result_message_list, error_list) + + def __end_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.end_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['終了日の変更'], + self.user_name, + self.table_name) + + def __modify_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.modify_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['MUID'], + self.user_name, + self.table_name) diff --git a/ecs/jskult-webapp/src/model/internal/session.py b/ecs/jskult-webapp/src/model/internal/session.py new file mode 100644 index 00000000..cba115a3 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/session.py @@ -0,0 +1,57 @@ +import datetime +import uuid + +from pynamodb.attributes import (JSONAttribute, NumberAttribute, + UnicodeAttribute) +from pynamodb.models import Model as DynamoDBTableModel + +from src.system_var import environment + + +class UserSession(DynamoDBTableModel): + class Meta: + table_name = environment.SESSION_TABLE_NAME + region = environment.AWS_REGION + session_key = UnicodeAttribute(hash_key=True) + user_id = UnicodeAttribute() + id_token = UnicodeAttribute() + doc_flg = NumberAttribute(null=True) + inst_flg = NumberAttribute(null=True) + bio_flg = NumberAttribute(null=True) + master_mainte_flg = NumberAttribute(null=True) + user_flg = UnicodeAttribute(null=True) + refresh_token = UnicodeAttribute() + csrf_token = UnicodeAttribute() + last_access_time = NumberAttribute() + record_expiration_time = NumberAttribute() + bio_search_condition = JSONAttribute(null=True, default=None) + bio_search_count = NumberAttribute(null=True, default=None) + + @classmethod + def new_last_access_time(cls): + return datetime.datetime.now().timestamp() + + @classmethod + def new_record_expiration_time(cls): + last_access_time = datetime.datetime.fromtimestamp(cls.new_last_access_time()) + # 1時間後に有効期限切れにする + return (last_access_time + datetime.timedelta(hours=1)).timestamp() + + @classmethod + def new( + cls, user_id, id_token, refresh_token, csrf_token, doc_flg, inst_flg, bio_flg, master_mainte_flg, user_flg + ): + return cls( + session_key=str(uuid.uuid4()), + user_id=user_id, + id_token=id_token, + refresh_token=refresh_token, + csrf_token=csrf_token, + doc_flg=doc_flg, + inst_flg=inst_flg, + bio_flg=bio_flg, + master_mainte_flg=master_mainte_flg, + user_flg=user_flg, + last_access_time=cls.new_last_access_time(), + record_expiration_time=cls.new_record_expiration_time() + ) diff --git a/ecs/jskult-webapp/src/model/request/__init__.py b/ecs/jskult-webapp/src/model/request/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/request/bio.py b/ecs/jskult-webapp/src/model/request/bio.py new file mode 100644 index 00000000..3120f4ed --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/bio.py @@ -0,0 +1,146 @@ +from typing import Optional + +from fastapi import Body, Form +from pydantic import BaseModel + +from src.util.sanitize import sanitize +from src.util.string_util import is_not_empty + + +@sanitize +class BioModel(BaseModel): + rec_whs_cd: Optional[str] + rec_whs_sub_cd: Optional[str] + whs_name: Optional[str] + slip_org_kbn: Optional[str] + rec_ymd_from: Optional[str] + rec_ymd_to: Optional[str] + rec_lot_num: Optional[str] + data_kbn: Optional[str] + mkr_cd: Optional[str] + rev_hsdnymd_srk_from: Optional[str] + rev_hsdnymd_srk_to: Optional[str] + iko_flg: Optional[str] + pageNumber: Optional[int] + pageSize: Optional[int] + + @classmethod + def as_form( + cls, + ctrl_wholesaler: str = Form(None), + ctrl_org_kbn: str = Form(None), + ctrl_rec_ymd_from: str = Form(None), + ctrl_rec_ymd_to: str = Form(None), + ctrl_rec_lot_num: str = Form(None), + ctrl_data_kbn: str = Form(None), + ctrl_maker_cd: str = Form(None), + ctrl_rev_hsdnymd_srk_from: str = Form(None), + ctrl_rev_hsdnymd_srk_to: str = Form(None), + ikoFlg: str = Form(None), + pageNumber: int = Form(None), + pageSize: int = Form(None) + ): + + return cls.__convert_request_param( + cls, + ctrl_wholesaler, + ctrl_org_kbn, + ctrl_rec_ymd_from, + ctrl_rec_ymd_to, + ctrl_rec_lot_num, + ctrl_data_kbn, + ctrl_maker_cd, + ctrl_rev_hsdnymd_srk_from, + ctrl_rev_hsdnymd_srk_to, + ikoFlg, + pageNumber, + pageSize + ) + + @classmethod + def as_body( + cls, + ctrl_wholesaler: str = Body(None), + ctrl_org_kbn: str = Body(None), + ctrl_rec_ymd_from: str = Body(None), + ctrl_rec_ymd_to: str = Body(None), + ctrl_rec_lot_num: str = Body(None), + ctrl_data_kbn: str = Body(None), + ctrl_maker_cd: str = Body(None), + ctrl_rev_hsdnymd_srk_from: str = Body(None), + ctrl_rev_hsdnymd_srk_to: str = Body(None), + ikoFlg: str = Body(None) + ): + + return cls.__convert_request_param( + cls, + ctrl_wholesaler, + ctrl_org_kbn, + ctrl_rec_ymd_from, + ctrl_rec_ymd_to, + ctrl_rec_lot_num, + ctrl_data_kbn, + ctrl_maker_cd, + ctrl_rev_hsdnymd_srk_from, + ctrl_rev_hsdnymd_srk_to, + ikoFlg + ) + + def __convert_request_param( + cls, + ctrl_wholesaler: str, + ctrl_org_kbn: str, + ctrl_rec_ymd_from: str, + ctrl_rec_ymd_to: str, + ctrl_rec_lot_num: str, + ctrl_data_kbn: str, + ctrl_maker_cd: str, + ctrl_rev_hsdnymd_srk_from: str, + ctrl_rev_hsdnymd_srk_to: str, + ikoFlg: str, + pageNumber: int = None, + pageSize: int = None + ): + wholesaler_code = None + wholesaler_sub_code = None + wholesaler_name = None + # 卸コード・卸サブコード + if is_not_empty(ctrl_wholesaler): + # 卸コードは`020-01:卸名`という感じのデータで来るので、分割 + wholesaler_without_name = ctrl_wholesaler.split(':')[0] + wholesaler_name = ctrl_wholesaler.split(':')[1] + wholesaler_code = wholesaler_without_name.split('-')[0] + wholesaler_sub_code = wholesaler_without_name.split('-')[1] + + # 処理日 + rec_ymd_from = None + rec_ymd_to = None + if is_not_empty(ctrl_rec_ymd_from): + rec_ymd_from = ctrl_rec_ymd_from.replace('/', '') + if is_not_empty(ctrl_rec_ymd_to): + rec_ymd_to = ctrl_rec_ymd_to.replace('/', '') + + # 発伝年月日 + rev_hsdnymd_srk_from = None + rev_hsdnymd_srk_to = None + if is_not_empty(ctrl_rev_hsdnymd_srk_from): + rev_hsdnymd_srk_from = ctrl_rev_hsdnymd_srk_from.replace('/', '') + if is_not_empty(ctrl_rev_hsdnymd_srk_to): + rev_hsdnymd_srk_to = ctrl_rev_hsdnymd_srk_to.replace('/', '') + + return cls( + rec_whs_cd=wholesaler_code, + rec_whs_sub_cd=wholesaler_sub_code, + whs_name=wholesaler_name, + slip_org_kbn=ctrl_org_kbn, + rec_ymd_from=rec_ymd_from, + rec_ymd_to=rec_ymd_to, + rec_lot_num=ctrl_rec_lot_num, + data_kbn=ctrl_data_kbn, + mkr_cd=ctrl_maker_cd, + rev_hsdnymd_srk_from=rev_hsdnymd_srk_from, + rev_hsdnymd_srk_to=rev_hsdnymd_srk_to, + iko_flg=ikoFlg, + pageNumber=pageNumber, + pageSize=pageSize + ) diff --git a/ecs/jskult-webapp/src/model/request/bio_download.py b/ecs/jskult-webapp/src/model/request/bio_download.py new file mode 100644 index 00000000..5f9e049b --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/bio_download.py @@ -0,0 +1,18 @@ +from fastapi import Body +from pydantic import BaseModel + + +class BioDownloadModel(BaseModel): + user_id: str + ext: str + + @classmethod + def as_body( + cls, + user_id: str = Body(), + ext: str = Body() + ): + return cls( + user_id=user_id, + ext=ext + ) diff --git a/ecs/jskult-webapp/src/model/request/login.py b/ecs/jskult-webapp/src/model/request/login.py new file mode 100644 index 00000000..0e7710cb --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/login.py @@ -0,0 +1,15 @@ +from fastapi import Form +from pydantic import BaseModel + + +class LoginModel(BaseModel): + username: str + password: str + + @classmethod + def as_form( + cls, + ctrl_username: str = Form(), + ctrl_password: str = Form() + ): + return cls(username=ctrl_username, password=ctrl_password) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py new file mode 100644 index 00000000..4155fa73 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -0,0 +1,169 @@ +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.string_util import is_not_empty + + +@sanitize +class MasterMainteCsvDlModel(RequestBaseModel): + 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] + apply_date_from: Optional[str] + adapt_apply_date_from: Optional[str] + start_date_from: Optional[str] + adapt_start_date_from: Optional[str] + start_date_to: Optional[str] + adapt_start_date_to: Optional[str] + end_date_from: Optional[str] + adapt_end_date_from: Optional[str] + end_date_to: Optional[str] + adapt_end_date_to: Optional[str] + select_table: Optional[str] + create_date_from: Optional[str] + adapt_create_date_from: Optional[str] + create_date_to: Optional[str] + adapt_create_date_to: Optional[str] + update_date_from: Optional[str] + adapt_update_date_from: Optional[str] + update_date_to: Optional[str] + adapt_update_date_to: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_ta_cd: Optional[str] = Form(None), + ctrl_inst_cd: Optional[str] = Form(None), + ctrl_emp_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), + ctrl_end_date_from: Optional[str] = Form(None), + ctrl_end_date_to: Optional[str] = Form(None), + radio_select_table: Optional[str] = Form(None), + ctrl_create_date_from: Optional[str] = Form(None), + ctrl_create_date_to: Optional[str] = Form(None), + ctrl_update_date_from: Optional[str] = Form(None), + ctrl_update_date_to: Optional[str] = Form(None) + ): + return cls.__convert_request_param( + cls, + ctrl_ta_cd, + ctrl_inst_cd, + ctrl_emp_cd, + ctrl_apply_date_from, + ctrl_start_date_from, + ctrl_start_date_to, + ctrl_end_date_from, + ctrl_end_date_to, + radio_select_table, + ctrl_create_date_from, + ctrl_create_date_to, + ctrl_update_date_from, + ctrl_update_date_to + ) + + def __convert_request_param( + cls, + ctrl_ta_cd: str, + ctrl_inst_cd: str, + ctrl_emp_cd: str, + ctrl_apply_date_from: str, + ctrl_start_date_from: str, + ctrl_start_date_to: str, + ctrl_end_date_from: str, + ctrl_end_date_to: str, + radio_select_table: str, + ctrl_create_date_from: str, + ctrl_create_date_to: str, + ctrl_update_date_from: str, + ctrl_update_date_to: str + ): + 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 '' + + adapt_apply_date_from = '' + if is_not_empty(ctrl_apply_date_from): + adapt_apply_date_from = ctrl_apply_date_from.replace('/', '') + else: + ctrl_apply_date_from = '' + + adapt_start_date_from = '' + adapt_start_date_to = '' + if is_not_empty(ctrl_start_date_from): + adapt_start_date_from = ctrl_start_date_from.replace('/', '') + else: + ctrl_start_date_from = '' + if is_not_empty(ctrl_start_date_to): + adapt_start_date_to = ctrl_start_date_to.replace('/', '') + else: + ctrl_start_date_to = '' + + adapt_end_date_from = '' + adapt_end_date_to = '' + if is_not_empty(ctrl_end_date_from): + adapt_end_date_from = ctrl_end_date_from.replace('/', '') + else: + ctrl_end_date_from = '' + if is_not_empty(ctrl_end_date_to): + adapt_end_date_to = ctrl_end_date_to.replace('/', '') + else: + ctrl_end_date_to = '' + + adapt_create_date_from = '' + adapt_create_date_to = '' + if is_not_empty(ctrl_create_date_from): + adapt_create_date_from = ctrl_create_date_from.replace('/', '-') + ' 00:00:00' + else: + ctrl_create_date_from = '' + if is_not_empty(ctrl_create_date_to): + adapt_create_date_to = ctrl_create_date_to.replace('/', '-') + ' 23:59:59' + else: + ctrl_create_date_to = '' + + adapt_update_date_from = '' + adapt_update_date_to = '' + if is_not_empty(ctrl_update_date_from): + adapt_update_date_from = ctrl_update_date_from.replace('/', '-') + ' 00:00:00' + else: + ctrl_update_date_from = '' + if is_not_empty(ctrl_update_date_to): + adapt_update_date_to = ctrl_update_date_to.replace('/', '-') + ' 23:59:59' + else: + ctrl_update_date_to = '' + + return cls( + ta_cd=ctrl_ta_cd, + adapt_ta_cd=ctrl_ta_cd, + inst_cd=ctrl_inst_cd, + adapt_inst_cd=ctrl_inst_cd, + emp_cd=ctrl_emp_cd, + adapt_emp_cd=ctrl_emp_cd, + apply_date_from=ctrl_apply_date_from, + adapt_apply_date_from=adapt_apply_date_from, + start_date_from=ctrl_start_date_from, + adapt_start_date_from=adapt_start_date_from, + start_date_to=ctrl_start_date_to, + adapt_start_date_to=adapt_start_date_to, + select_table=radio_select_table, + end_date_from=ctrl_end_date_from, + adapt_end_date_from=adapt_end_date_from, + end_date_to=ctrl_end_date_to, + adapt_end_date_to=adapt_end_date_to, + create_date_from=ctrl_create_date_from, + adapt_create_date_from=adapt_create_date_from, + create_date_to=ctrl_create_date_to, + adapt_create_date_to=adapt_create_date_to, + update_date_from=ctrl_update_date_from, + adapt_update_date_from=adapt_update_date_from, + update_date_to=ctrl_update_date_to, + adapt_update_date_to=adapt_update_date_to + ) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py new file mode 100644 index 00000000..2f24bd8b --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py @@ -0,0 +1,31 @@ +from typing import Optional, Annotated + +from fastapi import Form + +from src.util.sanitize import sanitize +from fastapi import File, UploadFile + +from src.model.request.request_base_model import RequestBaseModel + + +@sanitize +class MasterMainteCsvUpModel(RequestBaseModel): + csv_file: Optional[Annotated[UploadFile, File()]] + select_function: Optional[str] + select_table: Optional[str] + json_upload_data: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_csv_file: UploadFile = Form(None), + ctrl_select_function: Optional[str] = Form(None), + ctrl_select_table: Optional[str] = Form(None), + ctrl_json_upload_data: Optional[str] = Form(None) + ): + return cls( + csv_file=ctrl_csv_file, + select_function=ctrl_select_function, + select_table=ctrl_select_table, + json_upload_data=ctrl_json_upload_data + ) diff --git a/ecs/jskult-webapp/src/model/request/request_base_model.py b/ecs/jskult-webapp/src/model/request/request_base_model.py new file mode 100644 index 00000000..746d30bc --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/request_base_model.py @@ -0,0 +1,20 @@ +import html + +from pydantic import BaseModel + +from src.util.sanitize import sanitize + + +@sanitize +class RequestBaseModel(BaseModel): + """ + Webのリクエストを受け取る共通モデルクラス + 保持するメンバはエスケープされる + エスケープを解除するには、unescapeメソッドを使用する + """ + + def unescape(self): + for k, v in self.model_dump().items(): + if v is not None and type(v) is str: + setattr(self, k, html.unescape(v)) + return self diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py new file mode 100644 index 00000000..b670c126 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py @@ -0,0 +1,72 @@ +from typing import Optional + +from fastapi import Form + +from src.model.request.request_base_model import RequestBaseModel + + +class UltmarcDoctorSearchModel(RequestBaseModel): + dcf_pcf_dr_cd: Optional[str] + dr_name: Optional[str] + dr_name_kana: Optional[str] + dcf_dsf_inst_cd: Optional[str] + form_inst_name_kanji: Optional[str] + form_inst_name_kana: Optional[str] + prefc_cd: Optional[str] + blng_sec_name: Optional[str] + trt_course_name: Optional[str] + alma: Optional[str] + grad_y: Optional[str] + use_stop_div: Optional[str] + pagination_page_number: Optional[int] + + @classmethod + def as_form( + cls, + ctrl_dcf_pcf_dr_cd: str = Form(None), + ctrl_dr_name: str = Form(None), + ctrl_dr_name_kana: str = Form(None), + ctrl_dcf_dsf_inst_cd: str = Form(None), + ctrl_form_inst_name_kanji: str = Form(None), + ctrl_form_inst_name_kana: str = Form(None), + ctrl_prefc_cd: str = Form(None), + ctrl_blng_sec_name: str = Form(None), + ctrl_trt_course_name: str = Form(None), + ctrl_alma: str = Form(None), + ctrl_grad_y: str = Form(None), + use_stop_div_ctrl: str = Form(None), + pagination_page_number: str = Form(None) + ): + + return cls( + dcf_pcf_dr_cd=ctrl_dcf_pcf_dr_cd, + dr_name=ctrl_dr_name, + dr_name_kana=ctrl_dr_name_kana, + dcf_dsf_inst_cd=ctrl_dcf_dsf_inst_cd, + form_inst_name_kanji=ctrl_form_inst_name_kanji, + form_inst_name_kana=ctrl_form_inst_name_kana, + prefc_cd=ctrl_prefc_cd, + blng_sec_name=ctrl_blng_sec_name, + trt_course_name=ctrl_trt_course_name, + alma=ctrl_alma, + grad_y=ctrl_grad_y, + use_stop_div=use_stop_div_ctrl, + pagination_page_number=pagination_page_number + ) + + +class UltmarcDoctorInfoModel(RequestBaseModel): + doc_id: Optional[str] + page_num: Optional[int] + + @classmethod + def as_form( + cls, + doc_id: str = Form(None), + page_num: str = Form(None) + ): + + return cls( + doc_id=doc_id, + page_num=int(page_num) + ) diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py new file mode 100644 index 00000000..8823e071 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -0,0 +1,70 @@ +import html +from typing import Optional + +from fastapi import Form + +from src.model.request.request_base_model import RequestBaseModel + + +# @sanitize +class UltmarcInstSearchModel(RequestBaseModel): + dcf_dsf_inst_cd: Optional[str] + inst_div_cd: Optional[str] + form_inst_name_kanji: Optional[str] + form_inst_name_kana: Optional[str] + postal_number: Optional[str] + inst_phone_number: Optional[str] + prefc_cd: Optional[str] + delFlg: Optional[str] + inst_addr: Optional[str] + pagination_page_number: Optional[int] + + @classmethod + def as_form( + cls, + ctrl_dcf_dsf_inst_cd: str = Form(None), + ctrl_inst_div_cd: str = Form(None), + ctrl_form_inst_name_kanji: str = Form(None), + ctrl_form_inst_name_kana: str = Form(None), + ctrl_postal_number: str = Form(None), + ctrl_inst_phone_number: str = Form(None), + ctrl_prefc_cd: str = Form(None), + delFlg_ctrl: str = Form(None), + ctrl_inst_addr: str = Form(None), + pagination_page_number: str = Form(None) + ): + return cls( + dcf_dsf_inst_cd=ctrl_dcf_dsf_inst_cd, + inst_div_cd=ctrl_inst_div_cd, + form_inst_name_kanji=ctrl_form_inst_name_kanji, + form_inst_name_kana=ctrl_form_inst_name_kana, + postal_number=ctrl_postal_number, + inst_phone_number=ctrl_inst_phone_number, + prefc_cd=ctrl_prefc_cd, + delFlg=delFlg_ctrl, + inst_addr=ctrl_inst_addr, + pagination_page_number=pagination_page_number + ) + + def unescape(self): + for k, v in self.model_dump().items(): + if v is not None and type(v) is str: + setattr(self, k, html.unescape(v)) + return self + + +class UltmarcInstInfoModel(RequestBaseModel): + inst_id: Optional[str] + page_num: Optional[int] + + @classmethod + def as_form( + cls, + inst_id: str = Form(None), + page_num: str = Form(None) + ): + + return cls( + inst_id=inst_id, + page_num=int(page_num) + ) diff --git a/ecs/jskult-webapp/src/model/view/__init__.py b/ecs/jskult-webapp/src/model/view/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py new file mode 100644 index 00000000..aafa7864 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -0,0 +1,8 @@ +from src.model.db.bio_sales_lot import BioSalesLotDBModel +from src.util.sanitize import sanitize + + +@sanitize +class BioDisplayModel(BioSalesLotDBModel): + def __init__(self, param: BioSalesLotDBModel) -> None: + super().__init__(**param.model_dump()) diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py new file mode 100644 index 00000000..e0aab9ad --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -0,0 +1,45 @@ +from collections import OrderedDict + +from pydantic import BaseModel + +from src.model.db.pharmacy_product_master import PharmacyProductMasterModel +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.system_var import environment + + +class BioViewModel(BaseModel): + subtitle: str = '生物由来検索一覧' + user_id: str + whs_models: list[WholesalerMasterModel] + phm_models: list[PharmacyProductMasterModel] + search_data_max_length: int = environment.BIO_SEARCH_RESULT_MAX_COUNT + excel_max_lines: str = str(environment.BIO_EXCEL_RESULT_MAX_COUNT) + + def display_wholesaler_names(self): + display_names = [ + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name or ""}' + for whs_model in self.whs_models + ] + return display_names + + def display_org_kbn(self): + return OrderedDict( + { + '': '', + 'J': 'JD-NET', + 'N': 'NHI', + 'H': '手入力' + } + ) + + def display_data_kbn(self): + return OrderedDict( + { + '': '', + '0': '正常', + '1': 'ロットエラー', + '3': 'ロット不明', + '9': 'エラー(解消済み)', + '2': '除外' + } + ) 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 new file mode 100644 index 00000000..aa04068d --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -0,0 +1,31 @@ +from pydantic import BaseModel + +from src.util.string_util import is_not_empty + + +class InstEmpCsvDownloadViewModel(BaseModel): + subtitle: str = '施設担当者データCSVダウンロード' + is_search: bool = False + ta_cd: str = '' + inst_cd: str = '' + emp_cd: str = '' + apply_date_from: str = '' + start_date_from: str = '' + start_date_to: str = '' + end_date_from: str = '' + end_date_to: str = '' + create_date_from: str = '' + create_date_to: str = '' + update_date_from: str = '' + update_date_to: str = '' + select_table: str = '' + data_count: int = 0 + result_msg: str = '' + download_file_url: str = '' + file_name: str = '' + + def is_select_table_empty(self): + return not is_not_empty(self.select_table) + + def is_download_file_url_empty(self): + return not is_not_empty(self.download_file_url) diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py new file mode 100644 index 00000000..f7d40c00 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py @@ -0,0 +1,48 @@ +from pydantic import BaseModel + +from src.system_var import constants + + +class InstEmpCsvUploadViewModel(BaseModel): + subtitle: str = '施設担当者データCSVアップロード' + is_verified: bool = False + is_insert: bool = False + error_message_list: list[str] = None + select_function: str = None + select_table: str = None + csv_file_name: str = None + csv_upload_list: list[dict] = None + json_upload_data: str = None + result_message_list: list[str] = None + select_function_message: str = None + + def select_table_message(self): + return self.__dummy_table() if self.select_table == 'dummy' else self.__real_table() + + def upload_data_columns(self) -> list[str]: + return self.__inst_emp_columns() + + def is_select_function_empty(self): + return self.select_function is None or len(self.select_function) == 0 + + def is_select_table_empty(self): + return self.select_table is None or len(self.select_table) == 0 + + def is_error_message_list_empty(self): + return self.error_message_list is None or len(self.error_message_list) == 0 + + def csv_data_count(self): + return 0 if self.csv_upload_list is None else len(self.csv_upload_list) + + def __inst_emp_columns(self) -> list[str]: + if self.select_function == 'new': + return constants.NEW_INST_EMP_CSV_LOGICAL_NAMES + if self.select_function == 'change': + return constants.CHANGE_INST_CSV_LOGICAL_NAMES + return [] + + def __real_table(self): + return constants.CSV_REAL_TABLE_NAME + + def __dummy_table(self): + return constants.CSV_CHANGE_TABLE_NAME diff --git a/ecs/jskult-webapp/src/model/view/logout_view_model.py b/ecs/jskult-webapp/src/model/view/logout_view_model.py new file mode 100644 index 00000000..2be4ce7f --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/logout_view_model.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + + +class LogoutViewModel(BaseModel): + subtitle: str = 'MeDaCA Logout' + redirect_to: str + reason: str + link_text: str diff --git a/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py b/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py new file mode 100644 index 00000000..6d4f9108 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class MainteLoginViewModel(BaseModel): + subtitle: str = 'MeDaCA Mainte Login' diff --git a/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py b/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py new file mode 100644 index 00000000..2b1629b1 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class MasterMainteMenuViewModel(BaseModel): + subtitle: str = 'MeDaCA マスターメンテメニュー' diff --git a/ecs/jskult-webapp/src/model/view/menu_view_model.py b/ecs/jskult-webapp/src/model/view/menu_view_model.py new file mode 100644 index 00000000..06d62ab9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/menu_view_model.py @@ -0,0 +1,29 @@ +from pydantic import BaseModel + +from src.model.view.user_view_model import UserViewModel +from src.system_var import constants + + +class MenuViewModel(BaseModel): + subtitle: str = 'MeDaCA 機能メニュー' + batch_status: str + dump_status: str + user_model: UserViewModel + + def is_batch_processing(self): + return self.batch_status == constants.BATCH_STATUS_PROCESSING + + def is_backup_processing(self): + return self.dump_status != constants.DUMP_STATUS_UNPROCESSED + + def is_available_ult_doctor_menu(self): + return self.user_model.has_ult_doctor_permission() + + def is_available_ult_inst_menu(self): + return self.user_model.has_ult_inst_permission() + + def is_available_bio_menu(self): + return self.user_model.has_bio_permission() + + def is_available_master_maintenance_menu(self): + return self.user_model.has_master_maintenance_permission() diff --git a/ecs/jskult-webapp/src/model/view/table_override_view_model.py b/ecs/jskult-webapp/src/model/view/table_override_view_model.py new file mode 100644 index 00000000..2301527a --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/table_override_view_model.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + +class TableOverrideViewModel(BaseModel): + subtitle: str = 'テーブル上書きコピー' + + is_override: bool = False diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py new file mode 100644 index 00000000..4ed0537a --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -0,0 +1,124 @@ +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel +from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel +from src.model.db.ultmarc_doctor_wrkplace_his import \ + UltmarcDoctorWrkplaceHisDBModel +from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel +from src.model.db.ultmarc_specialist_license import \ + UltmarcSpecialistLicenseDBModel +from src.model.db.ultmarc_trt_course import UltmarcDrTrtCourseDBModel +from src.system_var import constants, environment + + +class UltmarcDoctorInfoViewModel(BaseModel): + subtitle: str = '医師情報' + is_batch_processing: bool = None + doctor_info_data: UltmarcDoctorInfoDBModel = None + trt_coursed_data: Optional[list[UltmarcDrTrtCourseDBModel]] = None + sosiety_data: Optional[list[UltmarcSosietyDBModel]] = None + specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] = None + doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] = None + doctor_wrkplace_his_data: Optional[list[UltmarcDoctorWrkplaceHisDBModel]] = None + doc_id: str = None + post_cnt: int = None + page_num: int = None + + # 現在のページ(表示用) + def is_page_num_view(self): + return self.page_num + 1 + + # 前ボタン + def is_disabled_prev(self): + return 'disabled' if self.page_num == 0 else '' + + # 次ボタン + def is_disabled_next(self): + if self.page_num == self.post_cnt - 1: + return 'disabled' + return '' + + # 生年月日 + def is_input_birthday_format(self): + if self.doctor_info_data.birthday is None or len(self.doctor_info_data.birthday) == 0: + return '' + birthday = self.doctor_info_data.birthday.replace(" ", "") + if len(birthday) == 8: + # 8桁の場合、yyyy/mm/ddとする + return f'{birthday[0:4]}/{birthday[4:6]}/{birthday[6:8]}' + if len(birthday) == 4: + # 4桁の場合、mm/ddとする + return f'{birthday[0:2]}/{birthday[2:4]}' + # 規格外の場合は、空表示とする + return '' + + # 利用停止区分 + + def is_input_use_stop_div_category_name(self): + if not self.doctor_info_data.use_stop_div: + return '' + return constants.DISPLAY_USER_STOP_DIV.get(self.doctor_info_data.use_stop_div, '') + + # 開始年月日 + def is_input_aply_start_ymd_format(self, aply_start_date: datetime): + if not aply_start_date: + return '' + return self._format_date(aply_start_date) + + # 医師勤務先履歴_開始年月日 + def is_input_his_aply_start_ymd_format(self, aply_start_date_string: str): + if not aply_start_date_string: + return '' + try: + # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す + aply_start_date = datetime.strptime(aply_start_date_string, '%Y%m%d') + except Exception: + return aply_start_date_string + return self._format_date(aply_start_date) + + # 医師勤務先履歴_終了年月日 + def is_input_his_aply_end_ymd_format(self, aply_end_date_string: str): + if not aply_end_date_string: + return '' + try: + # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す + aply_end_date = datetime.strptime(aply_end_date_string, '%Y%m%d') + except Exception: + return aply_end_date_string + return self._format_date(aply_end_date) + + # DM不可フラグ + def is_input_notdm_flg_name(self, notdm_flg: str): + if not notdm_flg: + return '' + if notdm_flg == '1': + return '不可' + + def is_input_trt_course_data_size(self): + return len(self.trt_coursed_data) + + def disabled_button(self): + return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' + + def is_form_submitted(self): + return self.form_data is not None + + def is_data_empty(self): + return len(self.doctor_data) == 0 + + def is_data_overflow_max_length(self): + return len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT + + def _format_date_string(self, date_string: str) -> str: + if date_string is None or date_string == '': + return '' + date_str = datetime.strptime(date_string, '%Y%m%d') + return date_str.strftime('%Y/%m/%d') + + def _format_date(self, date_time: datetime) -> str: + if date_time is None: + return '' + return date_time.strftime('%Y/%m/%d') diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py new file mode 100644 index 00000000..a3bfdd49 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py @@ -0,0 +1,145 @@ +import json +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.prefc_master import PrefcMasterModel +from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel +from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel +from src.system_var import constants, environment + + +class UltmarcDoctorSearchViewModel(BaseModel): + subtitle: str = '医師検索一覧' + is_batch_processing: bool = None + prefc_models: list[PrefcMasterModel] + doctor_data: Optional[list[UltmarcDoctorDBModel]] = None + form_data: UltmarcDoctorSearchModel = None + + def ultmarc_data_json_str(self): + """アルトマーク医師データの検索結果を指定された件数ごとに分割しながら返す""" + def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" + return obj.isoformat() if hasattr(obj, 'isoformat') else obj + + search_data_list = [model.model_dump() for model in self.doctor_data] + search_data_len = len(search_data_list) + # 呼び出し一回あたりの分割数 + part_size = 50 + for i in range(0, search_data_len, part_size): + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # JavaScriptに埋め込むため、バックスラッシュ、バッククォートをエスケープ + json_str = json_str.replace('\\', '\\\\') + json_str = json_str.replace("`", "\\`") + yield json_str + + # ページネーションのページ番号 + # 検索時は最初のページを表示する + # 詳細画面からの遷移時は、元のページを表示する + def init_pagination_page_number(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_page_number or 1 + + # 医師コード + def is_input_dcf_pcf_dr_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_pcf_dr_cd or '' + + # 氏名(漢字) + def is_input_dr_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dr_name or '' + + # 氏名(かな・カナ) + def is_input_dr_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dr_name_kana or '' + + # 勤務先コード + def is_input_dcf_dsf_inst_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_dsf_inst_cd or '' + + # 勤務先名(漢字) + def is_input_form_inst_name_kanji(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kanji or '' + + # 勤務先名(かな・カナ) + def is_input_form_inst_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kana or '' + + # 勤務先都道府県 + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd) + + def is_input_form_prefc_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.prefc_cd or '' + + # 所属部科(漢字) + def is_input_blng_sec_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.blng_sec_name or '' + + # 診療科目(漢字) + def is_input_trt_course_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.trt_course_name or '' + + # 出身大学(漢字) + def is_input_alma(self): + if not self.is_form_submitted(): + return '' + return self.form_data.alma or '' + + # 卒年 + def is_input_grad_y(self): + if not self.is_form_submitted(): + return '' + return self.form_data.grad_y or '' + + # 利用停止区分 + def is_checked_use_stop_div(self): + if not self.is_form_submitted(): + return 'checked' + return self._checked_value(self.form_data.use_stop_div) + + def is_input_use_stop_div(self): + if not self.is_form_submitted(): + return '' + return self.form_data.use_stop_div or '' + + def get_use_stop_div_category_name_short(self): + return json.dumps(constants.DISPLAY_USER_STOP_DIV_SHORT, ensure_ascii=False) + + def disabled_button(self): + return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' + + def is_form_submitted(self): + return self.form_data is not None + + def is_data_empty(self): + return self.doctor_data is None or len(self.doctor_data) == 0 + + def is_data_overflow_max_length(self): + return self.doctor_data is not None and len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT + + def _selected_value(self, form_value: str, current_value: str): + return 'selected' if form_value == current_value else '' + + def _checked_value(self, form_value: str): + return 'checked' if form_value else '' diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py new file mode 100644 index 00000000..1adb5d55 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py @@ -0,0 +1,91 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.ultmarc_inst_info import UltmarcInstInfoDBModel +from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel +from src.system_var import environment + + +class UltmarcInstInfoViewModel(BaseModel): + subtitle: str = '施設情報' + is_batch_processing: bool = None + inst_info_data: UltmarcInstInfoDBModel = None + inst_trt_coursed_data: Optional[list[UltmarcInstTrtCourseDBModel]] = None + doctor_wrkplace_count: int = None + inst_id: str = None + post_cnt: int = None + page_num: int = None + + # 未確認 + def is_checked_unconf_flg(self): + return 'checked' if self.inst_info_data.unconf_flg == '1' else '' + + # 休院店 + def is_checked_close_flg(self): + return 'checked' if self.inst_info_data.close_flg == '1' else '' + + # 開業 + def is_checked_estab_sche_flg(self): + return 'checked' if self.inst_info_data.estab_sche_flg == '1' else '' + + # 住所不明 + def is_checked_addr_unknown_reason_cd(self): + return 'checked' if self.inst_info_data.addr_unknown_reason_cd else '' + + # 開業 + def is_checked_phone_number_non_flg(self): + return 'checked' if self.inst_info_data.phone_number_non_flg == '1' else '' + + # 再審査区分 + def is_checked_re_exam_cd(self): + return 'checked' if self.inst_info_data.re_exam_cd else '' + + # 病棟閉鎖   + def is_checked_ward_abolish_flg(self): + return 'checked' if self.inst_info_data.ward_abolish_flg == '1' else '' + + # 一部病棟閉鎖 + def is_checked_ward_abolish_flg_part(self): + return 'checked' if self.inst_info_data.ward_abolish_flg == '2' else '' + + # 修正年月日 + def is_input_sys_update_date(self): + sys_update_date = str(self.inst_info_data.sys_update_date) + return sys_update_date[:10] + + # 勤務医師ボタン表示 + def is_disabled_doctor_wrkplace(self): + return 'disabled' if self.doctor_wrkplace_count == 0 else '' + + # 現在のページ(表示用) + def is_page_num_view(self): + return self.page_num + 1 + + # 前ボタン + def is_disabled_prev(self): + return 'disabled' if self.page_num == 0 else '' + + # 次ボタン + def is_disabled_next(self): + if self.page_num == self.post_cnt - 1: + return 'disabled' + return '' + + # 診療科目のデータ件数 + def is_input_inst_trt_course_data_size(self): + if self.inst_trt_coursed_data is None: + return 0 + return len(self.inst_trt_coursed_data) + + def disabled_button(self): + return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' + + def is_form_submitted(self): + return self.form_data is not None + + def is_data_empty(self): + return len(self.doctor_data) == 0 + + def is_data_overflow_max_length(self): + return len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py new file mode 100644 index 00000000..c8317400 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py @@ -0,0 +1,131 @@ +import json +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.inst_div_master import InstDivMasterModel +from src.model.db.prefc_master import PrefcMasterModel +from src.model.db.ultmarc_inst import UltmarcInstDBModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel +from src.system_var import environment + + +class UltmarcInstSearchViewModel(BaseModel): + subtitle: str = '施設検索一覧' + is_batch_processing: bool = None + prefc_models: list[PrefcMasterModel] + inst_div_models: list[InstDivMasterModel] + inst_data: Optional[list[UltmarcInstDBModel]] = None + form_data: UltmarcInstSearchModel = None + + def ultmarc_data_json_str(self): + """アルトマーク施設データの検索結果を指定された件数ごとに分割しながら返す""" + def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" + return obj.isoformat() if hasattr(obj, 'isoformat') else obj + + search_data_list = [model.model_dump() for model in self.inst_data] + search_data_len = len(search_data_list) + # 呼び出し一回あたりの分割数 + part_size = 50 + for i in range(0, search_data_len, part_size): + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # JavaScriptに埋め込むため、バックスラッシュ、バッククォートをエスケープ + json_str = json_str.replace('\\', '\\\\') + json_str = json_str.replace("`", "\\`") + yield json_str + + # ページネーションのページ番号 + # 検索時は最初のページを表示する + # 詳細画面からの遷移時は、元のページを表示する + def init_pagination_page_number(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_page_number or 1 + + # ULT施設コード + def is_input_dcf_dsf_inst_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_dsf_inst_cd or '' + + # 施設区分 + def is_selected_inst_div_cd(self, selected_inst_div_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.inst_div_cd, selected_inst_div_cd) + + def is_input_form_inst_div_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.inst_div_cd or '' + + # ULT施設名(漢字) + def is_input_form_inst_name_kanji(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kanji or '' + + # ULT施設名(かな・カナ) + def is_input_form_inst_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kana or '' + + # 郵便番号 + def is_input_postal_number(self): + if not self.is_form_submitted(): + return '' + return self.form_data.postal_number or '' + + # 電話番号 + def is_input_inst_phone_number(self): + if not self.is_form_submitted(): + return '' + return self.form_data.inst_phone_number or '' + + # 削除施設表示 + def is_checked_delFlg(self): + if not self.is_form_submitted(): + return 'checked' + return self._checked_value(self.form_data.delFlg) + + def is_input_delFlg(self): + if not self.is_form_submitted(): + return '' + return self.form_data.delFlg or '' + + # ULT施設住所 + def is_input_inst_addr(self): + if not self.is_form_submitted(): + return '' + return self.form_data.inst_addr or '' + + # 勤務先都道府県 + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd) + + def is_input_form_prefc_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.prefc_cd or '' + + def disabled_button(self): + return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' + + def is_form_submitted(self): + return self.form_data is not None + + def is_data_empty(self): + return self.inst_data is None or len(self.inst_data) == 0 + + def is_data_overflow_max_length(self): + return self.inst_data is not None and len(self.inst_data) >= environment.ULTMARC_SEARCH_RESULT_MAX_COUNT + + def _selected_value(self, form_value: str, current_value: str): + return 'selected' if form_value == current_value else '' + + def _checked_value(self, form_value: str): + return 'checked' if form_value else '' diff --git a/ecs/jskult-webapp/src/model/view/user_view_model.py b/ecs/jskult-webapp/src/model/view/user_view_model.py new file mode 100644 index 00000000..0dcf401d --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/user_view_model.py @@ -0,0 +1,24 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.system_var import constants + + +class UserViewModel(BaseModel): + bio_flg: Optional[int] # AUTH_FLG1 + doc_flg: Optional[int] # AUTH_FLG2 + inst_flg: Optional[int] # AUTH_FLG3 + master_mainte_flg: Optional[int] # AUTH_FLG4 + + def has_ult_doctor_permission(self): + return self.doc_flg == constants.PERMISSION_ENABLED + + def has_ult_inst_permission(self): + return self.inst_flg == constants.PERMISSION_ENABLED + + def has_bio_permission(self): + return self.bio_flg == constants.PERMISSION_ENABLED + + def has_master_maintenance_permission(self): + return self.master_mainte_flg == constants.PERMISSION_ENABLED diff --git a/ecs/jskult-webapp/src/repositories/__init__.py b/ecs/jskult-webapp/src/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/repositories/base_repository.py b/ecs/jskult-webapp/src/repositories/base_repository.py new file mode 100644 index 00000000..d6a97c38 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/base_repository.py @@ -0,0 +1,46 @@ +from abc import ABCMeta + +import pandas as pd +from sqlalchemy import text + +from src.db.database import DatabaseClient +from src.model.db.base_db_model import BaseDBModel + + +class BaseRepository(metaclass=ABCMeta): + + _database: DatabaseClient + + def __init__(self, db: DatabaseClient) -> None: + self._database = db + + def fetch_all(self) -> list[BaseDBModel]: + """データ全件取得メソッド""" + pass + + def fetch_one(self, parameter: dict) -> BaseDBModel: + """データ1件取得メソッド""" + pass + + def fetch_many(self, parameter: dict) -> list[BaseDBModel]: + """条件付きデータ取得メソッド""" + pass + + def fetch_as_data_frame(self, parameter: dict) -> pd.DataFrame: + """DBの取得結果をデータフレームにして返す""" + pass + + def _to_data_frame(self, query, parameter: BaseDBModel): + """DBの取得結果をデータフレームに変換する""" + params = params = parameter.model_dump() + + sql_query = pd.read_sql( + text(query), + con=self._database.session.connection(), + params=params) + + df = pd.DataFrame( + sql_query, + index=None + ) + return df diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py new file mode 100644 index 00000000..50296a3f --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -0,0 +1,180 @@ +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.bio_sales_lot import (BioSalesLotCountDBModel, + BioSalesLotDBModel) +from src.model.request.bio import BioModel +from src.repositories.base_repository import BaseRepository +from src.system_var import environment +from src.util.string_util import is_not_empty + +logger = get_logger('生物由来参照') + + +class BioSalesLotRepository(BaseRepository): + FETCH_SQL = """\ + SELECT + data_kind, + slip_mgt_num, + rec_ymd, + rec_whs_cd, + rec_whs_sub_cd, + whs_name, + rec_whs_org_cd, + rec_urag_num, + rev_hsdnymd_srk, + rec_tran_kbn, + tran_kbn_name, + mkr_cd, + rec_comm_cd, + product_name, + whs_rep_comm_name, + nonyu_fcl_cd, + rec_nonyu_fcl_name, + whs_rep_nonyu_fcl_name, + rec_nonyu_fcl_addr, + whs_rep_nonyu_fcl_addr, + rec_lot_num, + qty, + expr_dt, + data_kbn, + err_dtl_kind, + bef_slip_mgt_num, + ins_usr, + ins_dt, + inst_cd, + inst_name_form, + address, + tel_num, + -- Excel出力のため、数値型のコード値を文字列として取得(Veeva卸コード、Veeva卸組織コード、Veeva取引区分コード) + CAST(v_whs_cd AS CHAR) AS v_whs_cd, + CAST(v_whsorg_cd AS CHAR) AS v_whsorg_cd, + whs_org_name, + CAST(v_tran_cd AS CHAR) AS v_tran_cd, + iko_flg + FROM + src05.bio_sales_lot + WHERE + {where_clause} + ORDER BY + rec_whs_cd, + rec_whs_sub_cd, + rev_hsdnymd_srk, + slip_mgt_num + ASC + LIMIT {limit}\ + """ + + def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]: + try: + logger.debug('DB参照実行') + where_clause = self.__build_condition(parameter) + # ページングで取得するため、LIMIT,OFFSETを指定 + limit_clause = self.__build_paging_limit_clauses(parameter) + query = self.FETCH_SQL.format(where_clause=where_clause, limit=limit_clause) + logger.debug(f'SQL: {query}') + result = self._database.execute_select(query, parameter.model_dump()) + models = [BioSalesLotDBModel(**r) for r in result] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + def fetch_as_data_frame(self, parameter: BioModel, limitation: int): + try: + logger.debug('DB参照実行') + where_clause = self.__build_condition(parameter) + query = self.FETCH_SQL.format(where_clause=where_clause, limit=limitation) + logger.debug(f'SQL: {query}') + df = self._to_data_frame(query, parameter) + logger.debug(f'count= {len(df.index)}') + # ログ出力のため、クエリも返却 + return df, query + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + ( + SELECT 1 + FROM src05.bio_sales_lot + WHERE + {where_clause} + LIMIT {limit} + ) AS t\ + """ + + def fetch_count(self, parameter: BioModel) -> list[BioSalesLotDBModel]: + try: + logger.debug('DB参照実行') + where_clause = self.__build_condition(parameter) + # システムとしての最大取得件数 + 1まで取る + query = self.COUNT_SQL.format(where_clause=where_clause, limit=environment.BIO_SEARCH_RESULT_MAX_COUNT + 1) + logger.debug(f'SQL: {query}') + result = self._database.execute_select(query, parameter.model_dump()) + models = [BioSalesLotCountDBModel(**r) for r in result] + count = models[0].count if len(models) > 0 else 0 + logger.debug(f'count= {count}') + return count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + def __build_condition(self, parameter: BioModel): + where_clauses: list[SQLCondition] = [] + + # 検索条件が指定されずにSQLが壊れることを予防するため、常に真の固定条件を追加しておく + where_clauses.append(SQLCondition('', '', '1 = 1', literal=True)) + + # 卸(コード/サブコード) + if is_not_empty(parameter.rec_whs_cd) and is_not_empty(parameter.rec_whs_sub_cd): + where_clauses.append(SQLCondition('rec_whs_cd', condition.EQ, 'rec_whs_cd')) + where_clauses.append(SQLCondition('rec_whs_sub_cd', condition.EQ, 'rec_whs_sub_cd')) + # データ種別 + if is_not_empty(parameter.slip_org_kbn): + where_clauses.append(SQLCondition('slip_org_kbn', condition.EQ, 'slip_org_kbn')) + # 処理日 開始日 + if is_not_empty(parameter.rec_ymd_from): + where_clauses.append(SQLCondition('rec_ymd', condition.GE, 'rec_ymd_from')) + # 処理日 終了日 + if is_not_empty(parameter.rec_ymd_to): + where_clauses.append(SQLCondition('rec_ymd', condition.LE, 'rec_ymd_to')) + # ロット番号 + if is_not_empty(parameter.rec_lot_num): + rec_lot_num = parameter.rec_lot_num + # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 + rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ + where_clauses.append(SQLCondition('TRIM(rec_lot_num)', rec_lot_num_comparator, 'rec_lot_num')) + # データ区分 + if is_not_empty(parameter.data_kbn): + where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn')) + # 製品 + if is_not_empty(parameter.mkr_cd): + where_clauses.append(SQLCondition('mkr_cd', condition.EQ, 'mkr_cd')) + # 発伝年月日 開始日 + if is_not_empty(parameter.rev_hsdnymd_srk_from): + where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.GE, 'rev_hsdnymd_srk_from')) + # 発伝年月日 終了日 + if is_not_empty(parameter.rev_hsdnymd_srk_to): + where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.LE, 'rev_hsdnymd_srk_to')) + # 移行フラグ + # チェックが入っていない場合、移行対象(IKO_FLG = '*')を省く + if parameter.iko_flg is None: + where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True)) + # 固定条件 + # Viewで返されるロット番号9件をNull以外で抽出 + where_clauses.append(SQLCondition('LENGTH(TRIM(rec_lot_num))', condition.GT, '0', literal=True)) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + + logger.debug(f'条件設定終了:{where_clauses_str}') + return where_clauses_str + + def __build_paging_limit_clauses(self, parameter: BioModel) -> str: + page_size = parameter.pageSize or 0 + page_number = parameter.pageNumber or 0 + + return f'{page_size} OFFSET {(page_number - 1) * page_size}' diff --git a/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py new file mode 100644 index 00000000..319918e0 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py @@ -0,0 +1,29 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('ビジネスユニットマスタ') + + +class BuMasterRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.bu + WHERE + bu.bu_cd = :bu_cd + """ + + def fetch_count(self, bu_cd) -> MasterMenteCountModel: + try: + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'bu_cd': bu_cd}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py new file mode 100644 index 00000000..d91be694 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -0,0 +1,275 @@ +from src.repositories.base_repository import BaseRepository +from src.db.sql_condition import SQLCondition +from src.db import sql_condition as condition +from src.model.db.master_mente_count import MasterMenteCountModel +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.util.string_util import is_not_empty +from src.logging.get_logger import get_logger + +logger = get_logger('従業員担当施設マスタ') + + +class EmpChgInstRepository(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() + + INSERT_SQL = """\ + INSERT INTO {table_name} + ( + inst_cd, + ta_cd, + emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date + ) + VALUES ( + :inst_cd, + :ta_cd, + :emp_cd, + :bu_cd, + :start_date, + :end_date, + '1', + 'Y', + :create_user_name, + NOW(), + :update_user_name, + NOW() + ) + """ + + def insert_emp_chg_inst(self, inst_cd, ta_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_cd': emp_cd, + 'bu_cd': bu_cd, + 'start_date': start_date, + 'end_date': end_date, + 'create_user_name': create_user_name, + 'update_user_name': create_user_name + }) + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + UPDATE_END_DATE_SQL = """\ + UPDATE + {table_name} + SET + end_date = :end_date, + updater = :update_user_name, + update_date = NOW() + WHERE + inst_cd = :inst_cd + and ta_cd = :ta_cd + and start_date = :start_date + """ + + def end_emp_chg_inst(self, inst_cd, ta_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, + 'start_date': start_date, + 'end_date': end_date, + 'update_user_name': update_user_name + }) + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + UPDATE_EMP_CD_SQL = """\ + UPDATE + {table_name} + SET + emp_cd = :emp_cd, + updater = :update_user_name, + update_date = NOW() + where + inst_cd = :inst_cd + and ta_cd = :ta_cd + and start_date = :start_date + """ + + def modify_emp_chg_inst(self, inst_cd, ta_cd, start_date, 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, + 'start_date': start_date, + 'emp_cd': emp_cd, + 'update_user_name': update_user_name + }) + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + {table_name} + WHERE + inst_cd = :inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + + def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: + try: + query = self.FETCH_COUNT_SQL.format(table_name=table_name) + result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'start_date': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + FETCH_SQL = """\ + SELECT DISTINCT + eci.inst_cd AS inst_cd, + mi.inst_name AS inst_name, + eci.ta_cd AS ta_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, + bu.bu_name AS bu_name, + eci.start_date AS start_date, + eci.end_date AS end_date, + eci.creater AS creater, + eci.create_date AS create_date, + eci.updater AS updater, + eci.update_date AS update_date + FROM + {table_name} AS eci + LEFT JOIN mst_inst AS mi + ON eci.inst_cd = mi.inst_cd + LEFT JOIN emp + ON eci.emp_cd = emp.emp_cd + LEFT JOIN bu + ON eci.bu_cd = bu.bu_cd + WHERE + {where_clause} + """ + + def fetch_as_data_frame(self, table_name: str, parameter: MasterMainteCsvDlModel): + try: + where_clause = self.__build_condition(parameter) + query = self.FETCH_SQL.format(table_name=table_name, where_clause=where_clause) + logger.debug(f'SQL: {query}') + df = self._to_data_frame(query, parameter) + logger.debug(f'count= {df.shape[0]}') + return df + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + def __build_condition(self, parameter: MasterMainteCsvDlModel): + where_clauses: list[SQLCondition] = [] + + # 検索条件が指定されずにSQLが壊れることを予防するため、常に真の固定条件を追加しておく + where_clauses.append(SQLCondition('', '', '1 = 1', literal=True)) + + # 領域コードが入力されていた場合 + if is_not_empty(parameter.ta_cd): + parameter.adapt_ta_cd = f'%{parameter.ta_cd}%' + where_clauses.append(SQLCondition('eci.ta_cd', condition.LIKE, 'adapt_ta_cd')) + + # 施設コードが入力されていた場合 + if is_not_empty(parameter.inst_cd): + parameter.adapt_inst_cd = f'%{parameter.inst_cd}%' + where_clauses.append(SQLCondition('eci.inst_cd', condition.LIKE, 'adapt_inst_cd')) + + # MUIDが入力されていた場合 + if is_not_empty(parameter.emp_cd): + 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.adapt_apply_date_from): + where_clauses.append(SQLCondition('eci.start_date', condition.LE, 'adapt_apply_date_from')) + where_clauses.append(SQLCondition('eci.end_date', condition.GE, 'adapt_apply_date_from')) + + # 適用開始日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_start_date_from): + where_clauses.append(SQLCondition('eci.start_date', condition.GE, 'adapt_start_date_from')) + + # 適用開始日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_start_date_to): + where_clauses.append(SQLCondition('eci.start_date', condition.LE, 'adapt_start_date_to')) + + # 適用終了日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_end_date_from): + where_clauses.append(SQLCondition('eci.end_date', condition.GE, 'adapt_end_date_from')) + + # 適用終了日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_end_date_to): + where_clauses.append(SQLCondition('eci.end_date', condition.LE, 'adapt_end_date_to')) + + # データ作成日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_create_date_from): + where_clauses.append(SQLCondition('eci.create_date', condition.GE, 'adapt_create_date_from')) + + # データ作成日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_create_date_to): + where_clauses.append(SQLCondition('eci.create_date', condition.LE, 'adapt_create_date_to')) + + # データ更新日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_update_date_from): + where_clauses.append(SQLCondition('eci.update_date', condition.GE, 'adapt_update_date_from')) + + # データ更新日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_update_date_to): + where_clauses.append(SQLCondition('eci.update_date', condition.LE, 'adapt_update_date_to')) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + + logger.debug(f'条件設定終了:{where_clauses_str}') + return where_clauses_str + + DELETE_SQL = "DELETE FROM emp_chg_inst_wrk" + + def delete_dummy_table(self): + try: + query = self.DELETE_SQL + self._database.execute(query) + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e + + COPY_TABLE_SQL = "INSERT INTO emp_chg_inst_wrk SELECT * FROM emp_chg_inst" + + def copy_real_to_dummy(self): + try: + query = self.COPY_TABLE_SQL + self._database.execute(query) + except Exception as e: + logger.exception(f'DB Error : Exception={e.args}') + raise e diff --git a/ecs/jskult-webapp/src/repositories/emp_master_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py new file mode 100644 index 00000000..9ef6aa4a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -0,0 +1,31 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('従業員マスタ') + + +class EmpMasterRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.emp + WHERE + emp.emp_cd = :emp_cd + AND str_to_date(emp.start_date, '%Y%m%d') <= str_to_date(:start_work_date, '%Y%m%d') + AND str_to_date(:start_work_date, '%Y%m%d') <= str_to_date(emp.end_date ,'%Y%m%d') + """ + + def fetch_count(self, emp_cd, start_work_date) -> MasterMenteCountModel: + try: + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'emp_cd': emp_cd, 'start_work_date': start_work_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py new file mode 100644 index 00000000..b99485e9 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -0,0 +1,19 @@ +from src.logging.get_logger import get_logger +from src.model.db.hdke_tbl import HdkeTblModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('日付テーブル取得') + + +class HdkeTblRepository(BaseRepository): + FETCH_SQL = "SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl" + + def fetch_all(self) -> list[HdkeTblModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query) + models = [HdkeTblModel(**r) for r in result] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/inst_master_repository.py b/ecs/jskult-webapp/src/repositories/inst_master_repository.py new file mode 100644 index 00000000..59abcc5e --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/inst_master_repository.py @@ -0,0 +1,27 @@ +from src.logging.get_logger import get_logger +from src.model.db.inst_div_master import InstDivMasterModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_施設区分取得') + + +class InstDivMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + DISTINCT com_inst_div.inst_div_cd AS inst_div_cd, + com_inst_div.inst_div_name AS inst_div_name + FROM src05.com_inst + JOIN src05.com_inst_div on com_inst.inst_div_cd = com_inst_div.inst_div_cd + ORDER BY com_inst_div.inst_div_cd + """ + + def fetch_all(self) -> list[InstDivMasterModel]: + try: + result = self._database.execute_select(self.FETCH_SQL) + result_data = [res for res in result] + models = [InstDivMasterModel(**r) for r in result_data] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/mst_inst_repository.py b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py new file mode 100644 index 00000000..6ad64652 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py @@ -0,0 +1,29 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('メルク施設マスタ') + + +class MstInstRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.mst_inst + WHERE + mst_inst.inst_cd = :inst_cd + """ + + def fetch_count(self, inst_cd) -> MasterMenteCountModel: + try: + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'inst_cd': inst_cd}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py new file mode 100644 index 00000000..4b4083c8 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -0,0 +1,38 @@ +from src.logging.get_logger import get_logger +from src.model.db.pharmacy_product_master import PharmacyProductMasterModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('製品取得') + + +class PharmacyProductMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + t1.mkr_cd, + CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name + FROM + src05.phm_prd_mst_v t1 + INNER JOIN + ( + SELECT + prd_cd, MAX(sub_num) AS sno + FROM + src05.phm_prd_mst_v + WHERE rec_sts_kbn <> '9' + GROUP BY prd_cd + ) fmv2 + ON t1.prd_cd = fmv2.prd_cd AND t1.sub_num = fmv2.sno + WHERE + t1.mkr_cd IS NOT NULL + ORDER BY mkr_cd + """ + + def fetch_all(self) -> list[PharmacyProductMasterModel]: + try: + result = self._database.execute_select(self.FETCH_SQL) + models = [PharmacyProductMasterModel(**r) for r in result] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/prefc_master_repository.py b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py new file mode 100644 index 00000000..b9a7f795 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py @@ -0,0 +1,29 @@ +from src.logging.get_logger import get_logger +from src.model.db.prefc_master import PrefcMasterModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('都道府県マスタ取得') + + +class PrefcMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT DISTINCT + com_inst.prefc_cd AS prefc_cd, + mst_prefc.prefc_name AS prefc_name + FROM + src05.com_inst + JOIN src05.mst_prefc ON com_inst.prefc_cd = mst_prefc.prefc_cd + ORDER BY + mst_prefc.prefc_cd + """ + + def fetch_all(self) -> list[PrefcMasterModel]: + try: + result = self._database.execute_select(self.FETCH_SQL) + result_data = [res for res in result] + models = [PrefcMasterModel(**r) for r in result_data] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py new file mode 100644 index 00000000..ceca822d --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -0,0 +1,195 @@ +import mojimoji + +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.ultmarc_doctor import UltmarcDoctorDBModel +from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel +from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel +from src.repositories.base_repository import BaseRepository +from src.system_var import environment +from src.util.string_util import is_not_empty + +logger = get_logger('COM_医師取得') + + +class UltmarcDoctorRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_dr.dcf_pcf_dr_cd, + com_dr.dr_name, + com_inst.form_inst_name_kanji, + com_inst.dcf_dsf_inst_cd, + com_blng_sec.blng_sec_name, + GROUP_CONCAT(com_trt_course.trt_course_name separator ' / ') AS trt_course_name, + com_post.form_post_name, + com_alma.alma, + com_dr.grad_y, + com_dr.use_stop_div, + mst_prefc.prefc_name, + com_dr_wrkplace.blng_sec_cd + FROM + src05.com_dr + LEFT JOIN src05.mst_prefc ON com_dr.prefc_cd = mst_prefc.prefc_cd + LEFT JOIN src05.com_dr_wrkplace ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace.dcf_pcf_dr_cd + LEFT JOIN src05.com_inst ON com_dr_wrkplace.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd + LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace.blng_sec_cd = com_blng_sec.blng_sec_cd + LEFT JOIN src05.com_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd + LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd + LEFT JOIN src05.com_post ON com_dr_wrkplace.post_cd = com_post.post_cd + LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd + WHERE + {where_clause} + GROUP BY com_dr.dcf_pcf_dr_cd, com_inst.dcf_dsf_inst_cd, com_blng_sec.blng_sec_cd + ORDER BY + com_dr.dcf_pcf_dr_cd, + com_dr_wrkplace.dcf_dsf_inst_cd, + com_dr_wrkplace.blng_sec_cd, + com_dr_trt_course.trt_course_cd + LIMIT {limit} + \ + """ + + def fetch_many(self, parameter: UltmarcDoctorSearchModel) -> list[UltmarcDoctorDBModel]: + try: + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcDoctorSearchModel(**parameter.model_dump()) + where_clause = self.__build_condition(clone_parameter) + query = self.FETCH_SQL.format( + where_clause=where_clause, limit=environment.ULTMARC_SEARCH_RESULT_MAX_COUNT + 1) + result = self._database.execute_select(query, clone_parameter.model_dump()) + models = [UltmarcDoctorDBModel(**r) for r in result] + + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + def __build_condition(self, parameter: UltmarcDoctorSearchModel): + where_clauses: list[SQLCondition] = [] + + # 検索条件が指定されずにSQLが壊れることを予防するため、常に真の固定条件を追加しておく + where_clauses.append(SQLCondition('', '', '1 = 1', literal=True)) + + # 医師コード + if is_not_empty(parameter.dcf_pcf_dr_cd): + # 必ず部分一致で検索 + parameter.dcf_pcf_dr_cd = f'%{parameter.dcf_pcf_dr_cd}%' + where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE, 'dcf_pcf_dr_cd')) + # 氏名(漢字) + if is_not_empty(parameter.dr_name): + # 必ず部分一致で検索 + parameter.dr_name = f'%{parameter.dr_name}%' + where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name')) + # 氏名(かな・カナ) + if is_not_empty(parameter.dr_name_kana): + # 必ず部分一致で検索 + # ひらがなを全角カタカナへ変換 + zenkaku_katakana = ''.join([chr(n + 96) if (12352 < n and n < 12439) or n == 12445 or n == 12446 else chr(n) + for n in [ord(c) for c in parameter.dr_name_kana]]) + # 全角カタカナを半角カタカナへ変換 + hankaku_katakana = mojimoji.zen_to_han(zenkaku_katakana) + parameter.dr_name_kana = f'%{hankaku_katakana}%' + where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana')) + # 勤務先コード + if is_not_empty(parameter.dcf_dsf_inst_cd): + # 必ず部分一致で検索 + parameter.dcf_dsf_inst_cd = f'%{parameter.dcf_dsf_inst_cd}%' + where_clauses.append(SQLCondition( + 'com_inst.dcf_dsf_inst_cd', condition.LIKE, 'dcf_dsf_inst_cd')) + # 勤務先名(漢字) + if is_not_empty(parameter.form_inst_name_kanji): + # 必ず部分一致で検索 + parameter.form_inst_name_kanji = f'%{parameter.form_inst_name_kanji}%' + where_clauses.append(SQLCondition( + 'form_inst_name_kanji', condition.LIKE, 'form_inst_name_kanji')) + # 勤務先名(かな・カナ) + if is_not_empty(parameter.form_inst_name_kana): + # 必ず部分一致で検索 + # ひらがなを全角カタカナへ変換 + zenkaku_katakana = ''.join([chr(n + 96) if (12352 < n and n < 12439) or n == 12445 or n == 12446 else chr(n) + for n in [ord(c) for c in parameter.form_inst_name_kana]]) + # 全角カタカナを半角カタカナへ変換 + hankaku_katakana = mojimoji.zen_to_han(zenkaku_katakana) + parameter.form_inst_name_kana = f'%{hankaku_katakana}%' + where_clauses.append(SQLCondition( + 'form_inst_name_kana', condition.LIKE, 'form_inst_name_kana')) + + # 勤務先都道府県 + if is_not_empty(parameter.prefc_cd): + where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd')) + + # 所属部科(漢字) + if is_not_empty(parameter.blng_sec_name): + # 必ず部分一致で検索 + parameter.blng_sec_name = f'%{parameter.blng_sec_name}%' + where_clauses.append(SQLCondition( + 'com_blng_sec.blng_sec_name', condition.LIKE, 'blng_sec_name')) + + # 診療科目(漢字) + if is_not_empty(parameter.trt_course_name): + # 必ず部分一致で検索 + parameter.trt_course_name = f'%{parameter.trt_course_name}%' + where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name')) + + # 出身大学(漢字) + if is_not_empty(parameter.alma): + # 必ず部分一致で検索 + parameter.alma = f'%{parameter.alma}%' + where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma')) + + # 卒年 + if is_not_empty(parameter.grad_y): + # 必ず部分一致で検索 + parameter.grad_y = f'%{parameter.grad_y}%' + where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y')) + + # 利用停止区分 + if is_not_empty(parameter.use_stop_div) is False: + # 01・03・04を対象外とする + where_clauses.append(SQLCondition( + '', '', "(com_dr.use_stop_div NOT IN ('01','03','04') OR com_dr.use_stop_div IS NULL)", literal=True)) + + # 廃業除外 + if len(where_clauses) > 0: + where_clauses.append(SQLCondition( + '', '', '(length(com_inst.abolish_ymd) = 0 OR com_inst.abolish_ymd IS NULL)', literal=True)) + where_clauses.append(SQLCondition( + '', '', '(length(com_dr.abolish_ymd) = 0 OR com_dr.abolish_ymd IS NULL)', literal=True)) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + + return where_clauses_str + + FETCH_ONE_SQL = """\ + SELECT + com_dr.dcf_pcf_dr_cd, + com_dr.dr_name, + com_dr.dr_name_kana, + com_sex.sex, + com_dr.birthday, + com_alma.alma, + com_hometown.hometown, + com_dr.grad_y, + com_dr.use_stop_div, + com_dr.drday_y, + com_dr.estab_y + FROM src05.com_dr + LEFT JOIN src05.com_sex ON com_dr.sex_cd = com_sex.sex_cd + LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd + LEFT JOIN src05.com_hometown ON com_dr.hometown_cd = com_hometown.hometown_cd + WHERE dcf_pcf_dr_cd = :id + """ + + def fetch_one(self, id) -> UltmarcDoctorInfoDBModel: + try: + query = self.FETCH_ONE_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorInfoDBModel(**r) for r in result] + if len(models) == 0: + return None + return models[0] + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py new file mode 100644 index 00000000..708c30a9 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -0,0 +1,42 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_doctor_wrkplace_his import \ + UltmarcDoctorWrkplaceHisDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_医師勤務先履歴取得') + + +class UltmarcDoctorWrkplaceHisRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_inst.dcf_dsf_inst_cd, + com_inst.inst_name_kanji, + com_blng_sec.blng_sec_name, + univ_post.form_post_name as univ_post_name, + post.form_post_name as post_name, + com_dr_wrkplace_his.aply_start_ymd, + com_dr_wrkplace_his.aply_end_ymd, + com_dr_wrkplace_his.notdm_flg + FROM src05.com_dr + LEFT JOIN src05.com_dr_wrkplace_his ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace_his.dcf_pcf_dr_cd + LEFT JOIN src05.com_inst ON com_dr_wrkplace_his.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd + LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace_his.blng_sec_cd = com_blng_sec.blng_sec_cd + LEFT JOIN src05.com_post as univ_post ON com_dr_wrkplace_his.identity_cd = univ_post.post_cd + LEFT JOIN src05.com_post as post ON com_dr_wrkplace_his.post_cd = post.post_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_dr_wrkplace_his.aply_end_ymd DESC, + com_dr_wrkplace_his.aply_start_ymd DESC + """ + + def fetch_many(self, id) -> list[UltmarcDoctorWrkplaceHisDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorWrkplaceHisDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py new file mode 100644 index 00000000..fc42685a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -0,0 +1,59 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel +from src.model.db.ultmarc_doctor_wrkplace_count import \ + UltmarcDoctorWrkplaceCountDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_医師勤務先取得') + + +class UltmarcDoctorWrkplaceRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_inst.dcf_dsf_inst_cd, + com_inst.inst_name_kanji, + com_blng_sec.blng_sec_name, + univ_post.form_post_name AS univ_post_name, + post.form_post_name AS post_name, + com_dr_wrkplace.aply_start_ymd, + com_dr_wrkplace.notdm_flg + FROM src05.com_dr + LEFT JOIN src05.com_dr_wrkplace ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace.dcf_pcf_dr_cd + LEFT JOIN src05.com_inst ON com_dr_wrkplace.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd + LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace.blng_sec_cd = com_blng_sec.blng_sec_cd + LEFT JOIN src05.com_post as univ_post ON com_dr_wrkplace.identity_cd = univ_post.post_cd + LEFT JOIN src05.com_post as post ON com_dr_wrkplace.post_cd = post.post_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_dr_wrkplace.aply_start_ymd DESC + """ + + def fetch_many(self, id) -> list[UltmarcDoctorWrkplaceDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorWrkplaceDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + FETCH_COUNT_SQL = """\ + SELECT COUNT(*) AS count + FROM src05.com_dr_wrkplace + WHERE dcf_dsf_inst_cd = :id + """ + + def fetch_count(self, id) -> UltmarcDoctorWrkplaceCountDBModel: + try: + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorWrkplaceCountDBModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py new file mode 100644 index 00000000..6a86c9df --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -0,0 +1,196 @@ +import mojimoji + +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.ultmarc_inst import UltmarcInstDBModel +from src.model.db.ultmarc_inst_info import UltmarcInstInfoDBModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel +from src.repositories.base_repository import BaseRepository +from src.system_var import environment +from src.util.string_util import is_not_empty + +logger = get_logger('COM_施設取得') + + +class UltmarcInstRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + dcf_dsf_inst_cd, + abolish_ymd, + delete_sche_reason_cd, + form_inst_name_kanji, + inst_addr, + postal_number, + inst_phone_number, + inst_div_name, + hp_assrt_name, + prefc_name + FROM src05.com_inst + LEFT JOIN src05.mst_prefc ON com_inst.prefc_cd = mst_prefc.prefc_cd + LEFT JOIN src05.com_inst_div ON com_inst.inst_div_cd = com_inst_div.inst_div_cd + LEFT JOIN src05.com_hp_assrt ON com_inst.hp_assrt_cd = com_hp_assrt.hp_assrt_cd + WHERE {where_clause} + ORDER BY dcf_dsf_inst_cd + LIMIT {limit} + \ + """ + + def fetch_many(self, parameter: UltmarcInstSearchModel) -> list[UltmarcInstDBModel]: + try: + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcInstSearchModel(**parameter.model_dump()) + where_clause = self.__build_condition(clone_parameter) + query = self.FETCH_SQL.format( + where_clause=where_clause, limit=environment.ULTMARC_SEARCH_RESULT_MAX_COUNT + 1) + result = self._database.execute_select(query, clone_parameter.model_dump()) + models = [UltmarcInstDBModel(**r) for r in result] + + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + def __build_condition(self, parameter: UltmarcInstSearchModel): + where_clauses: list[SQLCondition] = [] + + # 検索条件が指定されずにSQLが壊れることを予防するため、常に真の固定条件を追加しておく + where_clauses.append(SQLCondition('', '', '1 = 1', literal=True)) + + # ULT施設コード + if is_not_empty(parameter.dcf_dsf_inst_cd): + # 部分一致検索 + parameter.dcf_dsf_inst_cd = f'%{parameter.dcf_dsf_inst_cd}%' + where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd', condition.LIKE, 'dcf_dsf_inst_cd')) + + # 施設区分 + if is_not_empty(parameter.inst_div_cd): + where_clauses.append(SQLCondition('com_inst.inst_div_cd', condition.EQ, 'inst_div_cd')) + + # ULT施設名(漢字) + if is_not_empty(parameter.form_inst_name_kanji): + # 部分一致検索 + parameter.form_inst_name_kanji = f'%{parameter.form_inst_name_kanji}%' + where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE, 'form_inst_name_kanji')) + + # ULT施設名(カナ) + if is_not_empty(parameter.form_inst_name_kana): + # 部分一致検索 + # ひらがなを全角カタカナへ変換 + zenkaku_katakana = ''.join([chr(n + 96) if (12352 < n and n < 12439) or n == 12445 or n == 12446 else chr(n) + for n in [ord(c) for c in parameter.form_inst_name_kana]]) + # 全角カタカナを半角カタカナへ変換 + hankaku_katakana = mojimoji.zen_to_han(zenkaku_katakana) + parameter.form_inst_name_kana = f'%{hankaku_katakana}%' + where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, 'form_inst_name_kana')) + + # 郵便番号 + if is_not_empty(parameter.postal_number): + # 前方一致検索 + parameter.postal_number = f'{parameter.postal_number}%' + where_clauses.append(SQLCondition('postal_number', condition.LIKE, 'postal_number')) + + # 電話番号 + if is_not_empty(parameter.inst_phone_number): + # 前方一致検索 + parameter.inst_phone_number = f'{parameter.inst_phone_number}%' + where_clauses.append(SQLCondition('inst_phone_number', condition.LIKE, 'inst_phone_number')) + + # 勤務先都道府県 + if is_not_empty(parameter.prefc_cd): + where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd')) + + # ULT施設住所 + if is_not_empty(parameter.inst_addr): + # 部分一致検索 + parameter.inst_addr = f'%{parameter.inst_addr}%' + where_clauses.append(SQLCondition('inst_addr', condition.LIKE, 'inst_addr')) + + # 削除表示フラグ + if is_not_empty(parameter.delFlg) is False: + # 論理和での検索 + where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True)) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + + return where_clauses_str + + FETCH_ONE_SQL = """\ + SELECT + com_inst.dcf_dsf_inst_cd, + com_inst.unconf_flg, + com_inst.dup_opp_cd, + com_inst.close_start_ym, + com_inst.close_flg, + com_inst.delete_sche_reason_cd, + com_inst.abolish_ymd, + com_inst.estab_sche_ym, + com_inst.estab_sche_flg, + com_inst.form_inst_name_kana, + com_inst.form_inst_name_kanji, + com_inst.inst_name_kana, + com_inst.inst_name_kanji, + com_inst.manage_cd, + com_inst.postal_number, + com_inst.inst_phone_number, + com_inst.addr_unknown_reason_cd, + com_inst.phone_number_non_flg, + com_inst.inst_addr_kana, + com_inst.inst_addr, + com_inst.re_exam_cd, + com_inst.rltd_univ_prnt_cd, + com_inst.insp_item_micrb, + com_inst.insp_item_serum, + com_inst.insp_item_blood, + com_inst.insp_item_patho, + com_inst.insp_item_paras, + com_inst.insp_item_biochem, + com_inst.insp_item_ri, + com_inst.prmit_bed_num_gen, + com_inst.prmit_bed_num_rcup, + com_inst.prmit_bed_num_mental, + com_inst.prmit_bed_num_infection, + com_inst.prmit_bed_num_tuber, + com_inst.prmit_bed_num_other, + com_inst.prmit_bed_num_sum, + com_inst.ward_abolish_flg, + com_inst.bed_num, + com_inst.prmit_bed_maint_ymd, + com_inst.inst_repre_cd, + com_inst.inst_repre_kana, + com_inst.inst_repre, + com_inst.sys_update_date, + com_inst_delete_sche_reason.delete_sche_reason, + com_inst_div.inst_div_name, + com_manage.manage_name, + com_hp_assrt.hp_assrt_name, + parent_inst.form_inst_name_kanji as parent_name, + com_spcare_med_office_dat.dcf_prnt_inst_cd + FROM src05.com_inst + LEFT JOIN src05.com_inst_div ON com_inst.inst_div_cd = com_inst_div.inst_div_cd + LEFT JOIN src05.com_inst_delete_sche_reason ON + com_inst.delete_sche_reason_cd = com_inst_delete_sche_reason.delete_sche_reason_cd + LEFT JOIN src05.com_manage ON com_inst.manage_cd = com_manage.manage_cd + LEFT JOIN src05.com_inst_addr_unknown_reason ON + com_inst.addr_unknown_reason_cd = com_inst_addr_unknown_reason.addr_unknown_reason_cd + LEFT JOIN src05.com_hp_assrt ON com_hp_assrt.hp_assrt_cd = com_inst.hp_assrt_cd + LEFT JOIN src05.com_re_exam ON com_inst.re_exam_cd = com_re_exam.re_exam_cd + LEFT JOIN src05.com_spcare_med_office_dat ON + com_inst.dcf_dsf_inst_cd = com_spcare_med_office_dat.dcf_chld_inst_cd + LEFT JOIN src05.com_inst as parent_inst ON com_inst.rltd_univ_prnt_cd = parent_inst.dcf_dsf_inst_cd + WHERE com_inst.dcf_dsf_inst_cd = :id + \ + """ + + def fetch_one(self, id) -> UltmarcInstInfoDBModel: + try: + query = self.FETCH_ONE_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcInstInfoDBModel(**r) for r in result] + if len(models) == 0: + return None + return models[0] + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py new file mode 100644 index 00000000..9fb36a8a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py @@ -0,0 +1,30 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_施設診療科目取得') + + +class UltmarcInstTrtCourseRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT com_trt_course.trt_course_name_abb + FROM src05.com_inst + JOIN src05.com_inst_trt_course ON com_inst.dcf_dsf_inst_cd = com_inst_trt_course.dcf_dsf_inst_cd + LEFT JOIN src05.com_trt_course ON com_inst_trt_course.trt_course_cd = com_trt_course.trt_course_cd + WHERE com_inst.dcf_dsf_inst_cd = :id + ORDER BY com_trt_course.trt_course_cd + """ + + def fetch_many(self, id) -> list[UltmarcInstTrtCourseDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + + models = [UltmarcInstTrtCourseDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py new file mode 100644 index 00000000..97418a9a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py @@ -0,0 +1,29 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_学会取得') + + +class UltmarcSosietyRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT com_sosiety.sosiety_cd, com_sosiety.sosiety_name + FROM src05.com_dr + LEFT JOIN src05.com_dr_sosiety ON com_dr.dcf_pcf_dr_cd = com_dr_sosiety.dcf_pcf_dr_cd + LEFT JOIN src05.com_sosiety ON com_dr_sosiety.sosiety_cd = com_sosiety.sosiety_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_sosiety.sosiety_cd + """ + + def fetch_many(self, id) -> list[UltmarcSosietyDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcSosietyDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py new file mode 100644 index 00000000..1e331142 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py @@ -0,0 +1,31 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_specialist_license import \ + UltmarcSpecialistLicenseDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_専門医資格取得') + + +class UltmarcSpecialistLicenseRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_specialist_license.specialist_cd, com_specialist_license.specialist_license_name + FROM src05.com_dr + LEFT JOIN src05.com_sp_field ON com_dr.dcf_pcf_dr_cd = com_sp_field.dcf_pcf_dr_cd + LEFT JOIN src05.com_specialist_license ON com_sp_field.specialist_cd = com_specialist_license.specialist_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_specialist_license.specialist_cd + """ + + def fetch_many(self, id) -> UltmarcSpecialistLicenseDBModel: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcSpecialistLicenseDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py new file mode 100644 index 00000000..16eaa8fe --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -0,0 +1,30 @@ +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_trt_course import UltmarcDrTrtCourseDBModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('COM_医師診療科目取得') + + +class UltmarcDrTrtCourseRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT com_trt_course.trt_course_name + FROM src05.com_dr + LEFT JOIN src05.com_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd + LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_trt_course.trt_course_cd + """ + + def fetch_many(self, id) -> list[UltmarcDrTrtCourseDBModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + + models = [UltmarcDrTrtCourseDBModel(**r) for r in result] + if len(models) == 0: + return None + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py new file mode 100644 index 00000000..7edde00a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -0,0 +1,28 @@ +from src.logging.get_logger import get_logger +from src.model.db.user_master import UserMasterModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('ユーザー取得') + + +class UserMasterRepository(BaseRepository): + FETCH_SQL = """\ + SELECT + * + FROM + src05.user_mst + WHERE + user_id = :user_id\ + """ + + def fetch_one(self, parameter: dict) -> UserMasterModel: + try: + query = self.FETCH_SQL + result = self._database.execute_select(query, parameter) + models = [UserMasterModel(**r) for r in result] + if len(models) == 0: + return None + return models[0] + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py new file mode 100644 index 00000000..0ed59753 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -0,0 +1,40 @@ +from src.logging.get_logger import get_logger +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.repositories.base_repository import BaseRepository + +logger = get_logger('卸データ取得') + + +class WholesalerMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT DISTINCT + b.rec_whs_cd, + b.rec_whs_sub_cd, + v2.name, + b.whs_name + FROM src05.bio_sales b + LEFT OUTER JOIN + ( + SELECT + sub_num, + name, + v_whs_cd, + rec_sts_kbn + FROM src05.whs_mst_v + WHERE src05.get_syor_date() BETWEEN start_date AND end_date + ) v2 + ON b.v_whs_cd = v2.v_whs_cd + AND v2.rec_sts_kbn <> '9' + ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_name DESC + """ + + def fetch_all(self) -> list[WholesalerMasterModel]: + try: + result = self._database.execute_select(self.FETCH_SQL) + result_data = [res for res in result] + models = [WholesalerMasterModel(**r) for r in result_data] + return models + except Exception as e: + logger.exception(f"DB Error : Exception={e}") + raise e diff --git a/ecs/jskult-webapp/src/router/__init__.py b/ecs/jskult-webapp/src/router/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py new file mode 100644 index 00000000..30690590 --- /dev/null +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -0,0 +1,140 @@ +from typing import Callable + +from fastapi import Request, Response +from fastapi.exceptions import HTTPException +from fastapi.routing import APIRoute +from starlette import status + +from src.depends.auth import (check_session_expired, get_current_session, + verify_session) +from src.error.exceptions import DBException, UnexpectedException +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.services.session_service import set_session +from src.system_var import constants, environment + +logger = get_logger('medaca_router') + + +class MeDaCaRoute(APIRoute): + """アプリケーションのカスタムルーター + + Args: + APIRoute (APIRoute): FastAPIの標準APIRoute + """ + + def get_route_handler(self) -> Callable: + """前後処理を付加するルートハンドラーを返す + + Raises: + e: HTTPException + UnexpectedException: HTTPException以外の例外をカスタム例外にする + + Returns: + Callable: カスタムルートハンドラー + """ + original_route_handler = super().get_route_handler() + + # 返却するルートハンドラーを定義。必ず非同期関数にする必要がある。 + async def custom_route_handler(request: Request) -> Response: + try: + # 事前処理 + request = await self.pre_process_route(request) + # 本来のルーティング処理 + response = await original_route_handler(request) + # 事後処理 + return await self.post_process_route(request, response) + except HTTPException as e: + raise e + except Exception as e: + logger.exception(e) + if isinstance(e, DBException): + raise UnexpectedException(detail=constants.LOGOUT_REASON_DB_ERROR) + else: + raise UnexpectedException(detail=constants.LOGOUT_REASON_UNEXPECTED) + return custom_route_handler + + async def pre_process_route(self, request: Request) -> Request: + """ルートハンドラーの事前処理 + + Args: + request (Request): FastAPIのリクエストクラス + + Returns: + Request: 加工後のRequestインスタンス + """ + return request + + async def post_process_route(self, request: Request, response: Response) -> Response: + """ルートハンドラーの事後処理 + + Args: + request (Request): FastAPIのリクエストインスタンス + response (Response): FastAPIのレスポンスインスタンス(original_route_handlerのレスポンス) + Returns: + Response: 加工後のResponseインスタンス + """ + return response + + +class BeforeCheckSessionRoute(MeDaCaRoute): + """事前処理として、セッションチェックを行うルートハンドラー + + Args: + MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + """ + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + # セッションを取得 + session_key = request.cookies.get('session') + current_session = get_current_session(session_key) + checked_session = check_session_expired(current_session) + verified_session = verify_session(checked_session) + # セッションが有効でない場合、エラーにする + if verified_session is None: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) + scope = request.scope + scope['session'] = verified_session + session_request = Request(receive=request.receive, scope=scope) + return session_request + + +class AfterSetCookieSessionRoute(MeDaCaRoute): + """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー""" + async def post_process_route(self, request: Request, response: Response): + response = await super().post_process_route(request, response) + + session_key = response.headers.get('session_key', None) + # セッションキーがない場合はセットせずに返す + if session_key is None: + return response + + del response.headers['session_key'] + + # セッションを更新 + session = get_current_session(session_key) + session.update( + actions=[ + UserSession.last_access_time.set(UserSession.new_last_access_time()), + UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()), + ] + ) + set_session(session) + # クッキーにセッションを設定 + response.set_cookie( + key='session', + value=session_key, + secure=True, + httponly=True + ) + return response + + +class AuthenticatedRoute(BeforeCheckSessionRoute, AfterSetCookieSessionRoute): + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + return request + + async def post_process_route(self, request: Request, response: Response): + response = await super().post_process_route(request, response) + return response diff --git a/ecs/jskult-webapp/src/services/__init__.py b/ecs/jskult-webapp/src/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/services/base_service.py b/ecs/jskult-webapp/src/services/base_service.py new file mode 100644 index 00000000..7fd71b3b --- /dev/null +++ b/ecs/jskult-webapp/src/services/base_service.py @@ -0,0 +1,14 @@ +from abc import ABCMeta + +from src.aws.aws_api_client import AWSAPIClient +from src.repositories.base_repository import BaseRepository + + +class BaseService(metaclass=ABCMeta): + # 各サービスが依存するrepositoryクラスのマップ + REPOSITORIES: dict[str, BaseRepository] = {} + # 各サービスが依存するAWS APIクライアントクラスのマップ + CLIENTS: dict[str, AWSAPIClient] = {} + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + pass diff --git a/ecs/jskult-webapp/src/services/batch_status_service.py b/ecs/jskult-webapp/src/services/batch_status_service.py new file mode 100644 index 00000000..ffb57af0 --- /dev/null +++ b/ecs/jskult-webapp/src/services/batch_status_service.py @@ -0,0 +1,55 @@ +from src.aws.aws_api_client import AWSAPIClient +from src.error.exceptions import DBException +from src.model.db.hdke_tbl import HdkeTblModel +from src.repositories.base_repository import BaseRepository +from src.repositories.hdke_tbl_repository import HdkeTblRepository +from src.services.base_service import BaseService +from src.system_var import constants + + +class BatchStatusService(BaseService): + + REPOSITORIES = { + 'hdke_table_repository': HdkeTblRepository + } + hdke_table_repository: HdkeTblRepository + __hdke_table_record: list[HdkeTblModel] = [] + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.hdke_table_repository = repositories['hdke_table_repository'] + # サービスインスタンス生成時に日付テーブルを取得する。取得できない場合は例外とする + try: + self.__hdke_table_record = self.hdke_table_repository.fetch_all() + except Exception as e: + raise DBException(e) + + @property + def hdke_table_record(self) -> HdkeTblModel: + """日付テーブルを取得する""" + + # 日付マスタのレコードがあることを確認 + self.__assert_record_exists() + # 日付テーブルのレコードは必ず1件 + return self.__hdke_table_record[0] + + def is_batch_processing(self): + """バッチ処理中かどうかを判定する""" + + # 日付マスタのレコードがあることを確認 + self.__assert_record_exists() + return self.hdke_table_record.bch_actf == constants.BATCH_STATUS_PROCESSING + + def is_dump_processing(self): + """dump処理処理中かどうかを判定する""" + + # 日付マスタのレコードがあることを確認 + self.__assert_record_exists() + return self.hdke_table_record.dump_sts_kbn != constants.DUMP_STATUS_UNPROCESSED + + def __assert_record_exists(self): + """日付テーブルが有ることを保証する""" + + # 日付マスタのレコードがない場合は例外とする + if len(self.__hdke_table_record) == 0: + raise DBException('日付テーブルのレコードが存在しません') diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py new file mode 100644 index 00000000..bbf01bcb --- /dev/null +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -0,0 +1,235 @@ +import asyncio +import functools +import os +import shutil +from datetime import datetime + +import pandas as pd + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BioDisplayModel +from src.model.view.bio_view_model import BioViewModel +from src.repositories.base_repository import BaseRepository +from src.repositories.bio_sales_lot_repository import BioSalesLotRepository +from src.repositories.pharmacy_product_master_repository import \ + PharmacyProductMasterRepository +from src.repositories.wholesaler_master_repository import \ + WholesalerMasterRepository +from src.services.base_service import BaseService +from src.system_var import constants, environment + +logger = get_logger('生物由来参照') + + +class BioViewService(BaseService): + REPOSITORIES = { + 'whs_repository': WholesalerMasterRepository, + 'phm_repository': PharmacyProductMasterRepository, + 'bio_sales_repository': BioSalesLotRepository + } + + CLIENTS = { + 's3_client': S3Client + } + + whs_repository: WholesalerMasterRepository + phm_repository: PharmacyProductMasterRepository + bio_sales_repository: BioSalesLotRepository + s3_client: S3Client + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.whs_repository = repositories['whs_repository'] + self.phm_repository = repositories['phm_repository'] + self.bio_sales_repository = repositories['bio_sales_repository'] + self.s3_client = clients['s3_client'] + + def prepare_bio_view( + self, + session: UserSession + ) -> BioViewModel: + # 卸リストを取得 + wholesalers = self.whs_repository.fetch_all() + # 製品リストを取得 + products = self.phm_repository.fetch_all() + bio = BioViewModel( + whs_models=wholesalers, + phm_models=products, + user_id=session.user_id + ) + return bio + + def search_bio_data(self, search_params: BioModel): + # 生物由来データを検索 + bio_sales_lot_data = self.bio_sales_repository.fetch_many(parameter=search_params) + # 画面表示用に加工 + display_bio_data: list[BioDisplayModel] = [BioDisplayModel(data) for data in bio_sales_lot_data] + + return display_bio_data + + def count_bio_data(self, search_params: BioModel, session: UserSession) -> int: + # 検索値が前回検索時と変更がない場合、キャッシュした件数を返す + previous_search_params = session.bio_search_condition + current_search_params = search_params.model_dump() + if previous_search_params == current_search_params: + return session.bio_search_count + + # 生物由来データの件数をDBから取得 + bio_sales_data_count = self.bio_sales_repository.fetch_count(parameter=search_params) + return bio_sales_data_count + + def search_download_bio_data( + self, + search_params: BioModel, + limitation=(environment.BIO_SEARCH_RESULT_MAX_COUNT + 1) + ): + # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 + bio_sales_data_frame, query = self.bio_sales_repository.fetch_as_data_frame( + parameter=search_params, limitation=limitation + ) + return bio_sales_data_frame, query + + def write_access_log( + self, + query: str, + parameters: BioModel, + user_id: str, + timestamp: datetime, + download_file_name: str + ): + # アクセスログを書き出し、S3に保管する + access_log_file_name = f'BioAccessLog_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.log' + # アクセスログファイル出力用のロガーを生成 + import logging + access_logger = logging.getLogger(access_log_file_name) + level = logging.getLevelName(environment.LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + access_logger.setLevel(level) + + access_log_file_path = os.path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, access_log_file_name) + if not access_logger.hasHandlers(): + access_log_handler = logging.FileHandler(access_log_file_path) + access_logger.addHandler(access_log_handler) + + formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + # SQL文を出力 + sql_message = f'ユーザーID: {user_id} SQL: {query}\t{download_file_name}' + access_logger.info(sql_message) + # 標準出力にも書き出す + logger.info(sql_message) + + # 検索パラメータを1行ずつ書き出す + for param_key, param_value in parameters.model_dump().items(): + if param_value is None or len(param_value) == 0: + continue + parameter_message = f'ユーザーID: {user_id} Value: {param_key} = {param_value}\t{download_file_name}' + logger.info(parameter_message) + access_logger.info(parameter_message) + + # ログファイルクローズ + access_log_handler.close() + + # S3にアップロード + self.upload_bio_access_log_file(access_log_file_path) + + async def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, download_file_name: str): + # 非同期処理用のイベントループを取得 + loop = asyncio.get_event_loop() + # Excelに書き込み + output_file_path = os.path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, download_file_name) + + # テンプレートファイルをコピーして出力ファイルの枠だけを作る + shutil.copyfile( + src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, + dst=output_file_path + ) + # ExcelWriterの追記モード(`mode`='a')でファイルを開く + # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) + # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する + with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: + # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 + # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 + # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 + + data_frame_range = len(data_frame) + data_frame_chunk_size = 2000 # 1回あたりの書き出し行数 + is_first = True # ループの初回 + # 指定行数ごとにデータを分割して処理 + for i in range(0, data_frame_range, data_frame_chunk_size): + chunk_df = data_frame.iloc[i:i + data_frame_chunk_size] + + start_row = i + 1 + # 1回目の分割では、ヘッダ部分を上書きしないようにする + if is_first: + is_first = False + start_row = 1 + await loop.run_in_executor(None, functools.partial( + chunk_df.to_excel, writer, + header=False, index=False, startrow=start_row, startcol=0)) + + return output_file_path + + async def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], download_file_name: str): + # 非同期処理用のイベントループを取得 + loop = asyncio.get_event_loop() + # csvに書き込み + output_file_path = os.path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, download_file_name) + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + await loop.run_in_executor(None, functools.partial( + output_df.to_csv, output_file_path, + index=False, header=False, encoding="utf-8_sig")) + + return output_file_path + + def upload_bio_data_file(self, local_file_path: str) -> None: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + # アップロード後、ローカルからは削除する + self.delete_local_file(local_file_path) + + def upload_bio_access_log_file(self, local_file_path: str) -> None: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + # アップロード後、ローカルからは削除する + self.delete_local_file(local_file_path) + + def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' + download_filename = f'{user_id}_生物由来卸販売データ.{kind}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) + + def delete_local_file(self, local_file_path: str): + os.remove(local_file_path) diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py new file mode 100644 index 00000000..aa1f37fd --- /dev/null +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -0,0 +1,57 @@ +import base64 +import hashlib +import hmac + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.cognito import CognitoClient +from src.error.exceptions import NotAuthorizeException +from src.model.db.user_master import UserMasterModel +from src.model.internal.jwt_token import JWTToken +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 + + +class LoginService(BaseService): + REPOSITORIES = { + 'user_repository': UserMasterRepository + } + + CLIENTS = { + 'cognito_client': CognitoClient + } + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.user_repository = repositories['user_repository'] + self.cognito_client = clients['cognito_client'] + + def login(self, username: str, password: str) -> JWTToken: + try: + id_token, refresh_token = self.cognito_client.login_by_user_password_flow( + username, + password, + self.__secret_hash(username) + ) + except Exception as e: + if e.response['Error']['Code'] == 'NotAuthorizedException': + raise NotAuthorizeException(e) + else: + raise e + + return JWTToken(id_token, refresh_token) + + def login_with_security_code(self, code: str) -> JWTToken: + return JWTToken.request(code) + + def logged_in_user(self, user_id): + user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) + return user_record + + 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') + key = bytes(environment.COGNITO_CLIENT_SECRET, 'utf-8') + digest = hmac.new(key, message, digestmod=hashlib.sha256).digest() + return base64.b64encode(digest).decode() diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py new file mode 100644 index 00000000..f3bbdb1a --- /dev/null +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -0,0 +1,260 @@ +import os +import json +import html +import csv + +import pandas as pd + +from fastapi import HTTPException +from io import TextIOWrapper +from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client +from src.error.exceptions import DBException +from starlette import status +from datetime import datetime +from src.services.base_service import BaseService +from src.system_var import constants, environment +from src.repositories.base_repository import BaseRepository +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.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 +from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel +from src.model.view.table_override_view_model import TableOverrideViewModel +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.logging.get_logger import get_logger + + +logger = get_logger('マスターメンテ') + + +class MasterMainteService(BaseService): + REPOSITORIES = { + 'mst_inst_repository': MstInstRepository, + 'emp_master_repository': EmpMasterRepository, + 'bu_master_repository': BuMasterRepository, + 'emp_chginst_repository': EmpChgInstRepository, + } + + CLIENTS = { + 's3_client': S3Client + } + + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository + s3_client: S3Client + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.mst_inst_repository = repositories['mst_inst_repository'] + self.emp_master_repository = repositories['emp_master_repository'] + self.bu_master_repository = repositories['bu_master_repository'] + self.emp_chginst_repository = repositories['emp_chginst_repository'] + self.s3_client = clients['s3_client'] + + def prepare_mainte_csv_up_view(self, + file: TextIOWrapper, + csv_file_name: str, + csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + + if csv_upload_form.select_function != 'new' and csv_upload_form.select_function != 'change': + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') + if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': + raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') + + (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) + + csv_items = MasterMainteCSVItems( + file, + csv_upload_form.select_function, + table_name, + self.mst_inst_repository, + self.emp_master_repository, + self.bu_master_repository, + self.emp_chginst_repository + ) + + error_message_list = [] + # CSVファイル0件(ヘッダ行のみ)チェック + if len(csv_items.lines) == 0: + error_message_list.append('選択されたCSVファイルの2行目以降に値が記入されておりません。') + else: + for row_item in csv_items: + error_message_list.extend([data for data in row_item.validate()]) + + csv_upload_list = [] + json_upload_data = '' + if len(error_message_list) == 0: + csv_upload_list: list[dict] = csv_items.to_dict() + # json作成 + json_upload_data = csv_items.to_json() + + mainte_csv_up = InstEmpCsvUploadViewModel( + is_verified=True, + error_message_list=error_message_list, + select_function=csv_upload_form.select_function, + select_table=csv_upload_form.select_table, + csv_upload_list=csv_upload_list, + json_upload_data=json_upload_data, + csv_file_name=csv_file_name, + select_function_message=self.__make_dialog_confirm_message( + csv_upload_form.select_function, + selected_table_msg) + ) + return mainte_csv_up + + def prepare_mainte_new_inst_view(self, + user_name: str, + csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + + (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) + + csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) + + if csv_upload_form.select_function == 'new': + emp_chg_inst = NewEmpChgInstFunction( + csv_data_list, + table_name, + selected_table_msg, + user_name, + self.emp_chginst_repository) + elif csv_upload_form.select_function == 'change': + emp_chg_inst = ChangeEmpChgInstFunction( + csv_data_list, + table_name, + selected_table_msg, + user_name, + self.emp_chginst_repository) + else: + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') + + (result_message_list, raw_error_list) = emp_chg_inst.save() + + error_message_list = [] + error_message_list.extend(raw_error_list) + + mainte_csv_up = InstEmpCsvUploadViewModel( + is_insert=True, + result_message_list=result_message_list, + error_message_list=error_message_list + ) + return mainte_csv_up + + def copy_data_real_to_dummy(self) -> TableOverrideViewModel: + try: + self.emp_chginst_repository.to_jst() + self.emp_chginst_repository.begin() + self.emp_chginst_repository.delete_dummy_table() + self.emp_chginst_repository.copy_real_to_dummy() + self.emp_chginst_repository.commit() + except Exception as e: + self.emp_chginst_repository.rollback() + raise e + + # コピー完了をマークして画面に返却 + table_override = TableOverrideViewModel( + is_override=True + ) + return table_override + + def search_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame: + try: + csv_download_form.unescape() + # 施設担当者データを検索 + search_result_df = self.search_download_emp_chg_inst_data(csv_download_form) + except DBException as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + + return search_result_df + + def search_download_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel): + (table_name, _) = self.__choose_target_table(csv_download_form.select_table) + search_result_df = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form) + return search_result_df + + def write_csv_file(self, data_frame: pd.DataFrame, header: list[str], download_file_name: str): + # csvに書き込み + output_file_path = os.path.join(constants.MENTE_CSV_TEMPORARY_FILE_DIR_PATH, download_file_name) + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + output_df.to_csv(output_file_path, encoding="utf-8_sig", quoting=csv.QUOTE_ALL, index=False, header=False) + + return output_file_path + + def upload_emp_chg_inst_data_file(self, df: pd.DataFrame, user_id: str, select_table: str) -> tuple[str, str]: + if df.shape[0] == 0: + return '該当データが存在しないためCSVファイルを出力しませんでした', '' + + # ファイル名に使用するタイムスタンプを初期化しておく + current_timestamp = datetime.now() + download_file_name = f'Result_{user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv' + + # ファイルを書き出し(CSV) + local_file_path = self.__write_emp_chg_inst_data_to_file(df, download_file_name) + + # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する + download_file_url = '' + try: + bucket_name = environment.MASTER_MAINTENANCE_BUCKET + file_key = f'data/{os.path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + # アップロード後、ローカルからは削除する + self.delete_local_file(local_file_path) + download_file_url = self.generate_download_file_url(local_file_path) + except Exception as e: + logger.exception(f'S3 アクセスエラー{e}') + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'aws_error', 'message': e.args} + ) + if select_table == 'dummy': + result_msg = f'ダミーテーブルのデータ{df.shape[0]}件をCSVファイルに出力しました' + else: + result_msg = f'本番テーブルのデータ{df.shape[0]}件をCSVファイルに出力しました' + + return result_msg, download_file_url + + def generate_download_file_url(self, local_file_path: str) -> str: + bucket_name = environment.MASTER_MAINTENANCE_BUCKET + file_key = f'data/{os.path.basename(local_file_path)}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, constants.MENTE_CSV_DOWNLOAD_FILE_NAME) + + def __write_emp_chg_inst_data_to_file(self, df: pd.DataFrame, download_file_name: str) -> str: + logger.info('CSVファイルを出力する') + local_file_path = self.write_csv_file( + df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name) + + return local_file_path + + def __choose_target_table(self, select_table: str): + if select_table == 'dummy': + table_name = 'src05.emp_chg_inst_wrk' + selected_table_msg = constants.CSV_CHANGE_TABLE_NAME + elif select_table == 'real': + table_name = 'src05.emp_chg_inst' + selected_table_msg = constants.CSV_REAL_TABLE_NAME + else: + raise Exception(f'登録テーブルの選択値が不正です: {select_table}') + return (table_name, selected_table_msg) + + def __make_dialog_confirm_message(self, select_function: str, selected_table_msg: str) -> str: + select_function_msg = '新規施設登録' if select_function == 'new' else '施設担当者変更' + return f'{selected_table_msg}に{select_function_msg}を行いますか?' + + def delete_local_file(self, local_file_path: str): + os.remove(local_file_path) diff --git a/ecs/jskult-webapp/src/services/session_service.py b/ecs/jskult-webapp/src/services/session_service.py new file mode 100644 index 00000000..b58d7241 --- /dev/null +++ b/ecs/jskult-webapp/src/services/session_service.py @@ -0,0 +1,26 @@ + +from src.logging.get_logger import get_logger +from src.model.internal.session import UserSession + +logger = get_logger('セッション管理') + + +def set_session(session: UserSession) -> str: + session.save() + return session.session_key + + +def get_session(key: str) -> UserSession: + try: + session = UserSession.get(hash_key=key, consistent_read=True) + return session + except UserSession.DoesNotExist as e: + logger.debug(f'セッション取得失敗:{e}') + return None + +def delete_session (session: UserSession): + try: + session.delete() + return + except: + return \ No newline at end of file diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py new file mode 100644 index 00000000..e210b7c8 --- /dev/null +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -0,0 +1,158 @@ +from src.aws.aws_api_client import AWSAPIClient +from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel +from src.model.view.ultmarc_doctor_info_view_model import \ + UltmarcDoctorInfoViewModel +from src.model.view.ultmarc_doctor_search_view_model import \ + UltmarcDoctorSearchViewModel +from src.model.view.ultmarc_inst_info_view_model import \ + UltmarcInstInfoViewModel +from src.model.view.ultmarc_inst_search_view_model import \ + UltmarcInstSearchViewModel +from src.repositories.base_repository import BaseRepository +from src.repositories.inst_master_repository import InstDivMasterRepository +from src.repositories.prefc_master_repository import PrefcMasterRepository +from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository +from src.repositories.ultmarc_dr_wrkplace_his_repository import \ + UltmarcDoctorWrkplaceHisRepository +from src.repositories.ultmarc_dr_wrkplace_repository import \ + UltmarcDoctorWrkplaceRepository +from src.repositories.ultmarc_inst_repository import UltmarcInstRepository +from src.repositories.ultmarc_inst_trt_course_repository import \ + UltmarcInstTrtCourseRepository +from src.repositories.ultmarc_sosiety_repository import \ + UltmarcSosietyRepository +from src.repositories.ultmarc_specialist_license_repository import \ + UltmarcSpecialistLicenseRepository +from src.repositories.ultmarc_trt_course_repository import \ + UltmarcDrTrtCourseRepository +from src.services.base_service import BaseService + + +class UltmarcViewService(BaseService): + REPOSITORIES = { + 'ultmarc_doctor_repository': UltmarcDoctorRepository, + 'prefc_repository': PrefcMasterRepository, + 'inst_div_repository': InstDivMasterRepository, + 'ultmarc_inst_repository': UltmarcInstRepository, + 'ultmarc_trt_course_repository': UltmarcDrTrtCourseRepository, + 'ultmarc_inst_trt_course_repository': UltmarcInstTrtCourseRepository, + 'ultmarc_sosiety_repository': UltmarcSosietyRepository, + 'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository, + 'ultmarc_doctor_wrkplace_his_repository': UltmarcDoctorWrkplaceHisRepository, + 'ultmarc_specialist_license_repository': UltmarcSpecialistLicenseRepository + } + + ultmarc_doctor_repository: UltmarcDoctorRepository + prefc_repository: PrefcMasterRepository + inst_div_repository: InstDivMasterRepository + ultmarc_inst_repository: UltmarcInstRepository + ultmarc_trt_course_repository: UltmarcDrTrtCourseRepository + ultmarc_inst_trt_course_repository: UltmarcInstTrtCourseRepository + ultmarc_sosiety_repository: UltmarcSosietyRepository + ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository + ultmarc_doctor_wrkplace_his_repository: UltmarcDoctorWrkplaceHisRepository + ultmarc_specialist_license_repository: UltmarcSpecialistLicenseRepository + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.ultmarc_doctor_repository = repositories['ultmarc_doctor_repository'] + self.prefc_repository = repositories['prefc_repository'] + self.inst_div_repository = repositories['inst_div_repository'] + self.ultmarc_inst_repository = repositories['ultmarc_inst_repository'] + self.ultmarc_trt_course_repository = repositories['ultmarc_trt_course_repository'] + self.ultmarc_inst_trt_course_repository = repositories['ultmarc_inst_trt_course_repository'] + self.ultmarc_sosiety_repository = repositories['ultmarc_sosiety_repository'] + self.ultmarc_doctor_wrkplace_repository = repositories['ultmarc_doctor_wrkplace_repository'] + self.ultmarc_doctor_wrkplace_his_repository = repositories['ultmarc_doctor_wrkplace_his_repository'] + self.ultmarc_specialist_license_repository = repositories['ultmarc_specialist_license_repository'] + + ######################### + # アルトマーク医師 # + ######################### + def prepare_ultmarc_doctor_search_view( + self + ) -> UltmarcDoctorSearchViewModel: + # 医師一覧画面の表示データ取得 + # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + + ultmarc = UltmarcDoctorSearchViewModel( + prefc_models=prefcs + ) + return ultmarc + + def search_doctor_data(self, search_params: UltmarcDoctorSearchModel): + # 医師データを検索 + ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) + return ultmarc_doctor_data + + def prepare_ultmarc_doctor_info_view( + self, + id + ) -> UltmarcDoctorInfoViewModel: + # 医師情報画面の表示データ取得 + # 医師情報を取得 + doctor_info = self.ultmarc_doctor_repository.fetch_one(id) + # 診療科目情報を取得 + trt_course = self.ultmarc_trt_course_repository.fetch_many(id) + # 所属学会情報を取得 + sosiety = self.ultmarc_sosiety_repository.fetch_many(id) + # 所属学会専門医情報を取得 + specialist_license = self.ultmarc_specialist_license_repository.fetch_many(id) + # 勤務先情報を取得 + wrkplace = self.ultmarc_doctor_wrkplace_repository.fetch_many(id) + # 勤務先履歴情報を取得 + wrkplace_his = self.ultmarc_doctor_wrkplace_his_repository.fetch_many(id) + + ultmarc = UltmarcDoctorInfoViewModel( + doctor_info_data=doctor_info, + trt_coursed_data=trt_course, + sosiety_data=sosiety, + specialist_license_data=specialist_license, + doctor_wrkplace_data=wrkplace, + doctor_wrkplace_his_data=wrkplace_his + ) + return ultmarc + + ######################### + # アルトマーク施設 # + ######################### + def prepare_ultmarc_inst_search_view( + self + ) -> UltmarcInstSearchViewModel: + # 施設一覧画面の表示データ取得 + # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + # 施設区分リストを取得 + inst_div = self.inst_div_repository.fetch_all() + + ultmarc = UltmarcInstSearchViewModel( + prefc_models=prefcs, + inst_div_models=inst_div + ) + return ultmarc + + def search_inst_data(self, search_params: UltmarcInstSearchModel): + # 施設データを検索 + ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) + return ultmarc_inst_data + + def prepare_ultmarc_inst_info_view( + self, + id + ) -> UltmarcInstInfoViewModel: + # 施設情報画面の表示データ取得 + # 施設情報を取得 + inst_info = self.ultmarc_inst_repository.fetch_one(id) + # 診療科目情報を取得 + inst_trt_course = self.ultmarc_inst_trt_course_repository.fetch_many(id) + # 医師件数を取得 + doctor_count = self.ultmarc_doctor_wrkplace_repository.fetch_count(id) + + ultmarc = UltmarcInstInfoViewModel( + inst_info_data=inst_info, + inst_trt_coursed_data=inst_trt_course, + doctor_wrkplace_count=doctor_count + ) + return ultmarc diff --git a/ecs/jskult-webapp/src/static/__init__.py b/ecs/jskult-webapp/src/static/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css new file mode 100644 index 00000000..4b158b38 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -0,0 +1,320 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +*, ::after, ::before { + box-sizing: revert; +} + +body { + white-space: nowrap; +} + +h1 { + font-size: 155%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; + font-weight: 700; +} + +.title { + width: 800px; +} + +table{ + border-collapse : collapse; +} + +.headerTable{ + width: 100%; +} + +.headerTd{ + width: 24%; +} + +.headerTdCenter{ + text-align: center; + width: 50%; +} + +.headerTdRight{ + text-align: right; + padding-right: 2%; +} + +.header_bt{ + width: 40%; +} + +.toMenu_bt{ + width: 130px; +} + +.search_table { + margin-bottom: 1%; + padding-bottom: 1%; + width: 100%; +} + +.searchColumnTd{ + width: 14%; +} + +.searchTextBoxTd{ + width: 18%; +} + +._form { + width: 95%; + margin-left: 3%; +} + +._form._border { + border-bottom: solid 1px gray; + margin-bottom: 10px; +} + +.back_bt { + padding-bottom: 10px; +} + +._form input[type=text] { + width: 193px; + height: 25px; +} +._form input[type=checkbox] { + width: 13px; + height: 13px; +} + +._form select { + width: 193px; + height: 25px; +} + +.result_info { + text-align: right; +} + + +.search_tb { + padding-right: 25px; +} + +.search_bt { + /* width: 60px; */ + margin-left: 10px; +} + +.clear_bt{ + margin-left: 120px; + /* width: 60px */ +} + +.search_dropdown { + width: 175px; +} + +.bioScroll_div { + overflow: auto; + white-space: nowrap; + margin-top: 1%; + margin-bottom: 1%; + width: 100%; + height: 500px; +} +.bioScroll_div::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.bioScroll_div::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.bioScroll_div::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.noLine{ + text-decoration: none; +} + +.resultAreaMsg { + margin-top: 5%; + text-align: center; + font-size: 150%; +} + +.search_btTd { + text-align: right; +} + +.selection { + display: none; +} + +#page-1 { + display: block; +} + +.search_middleTd { + padding-right: 25px; + width : 450px; +} + +.transition{ + text-align: right; + margin-right: 60px; +} + +.transition_bt{ + width: 110px; + height: 40px; + margin-left: 15px; + margin-right: 15px; +} + +.instutionInfo_table{ + width: 1132px; + margin-bottom: 50px; +} + +.institution_column { + width : 160px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.institution_data { + background : rgb(244, 244, 244); + border : solid 1px; + padding-left : 0.5em; + padding-right : 0.5em; +} + +.data_width_long { + width : 500px; +} + +.data_width_middle { + width : 300px; +} + +.data_width_short { + width : 100px; +} + +.checkbox_margin { + margin-left : 20px; +} + +.border_top_none { + border-top-style:none; +} + +.border_bottom_none { + border-bottom-style:none; +} + +.textbox_margin { + margin-left : 20px; +} + +.textbox_margin_short { + margin-left : 5px; +} + +.label_margin { + margin-left: 10px; + margin-right: 10px; +} + +.trt_course{ + width: 70px; +} + +.small_tb{ + width: 100px; +} + +.docBelongScroll_div { + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; +} + +.rightPadding_table{ + padding-right: 50px; +} + +.verticalBar_td{ + width: 1px; + height: 150px; + background-color: gray; +} + +.docPlaceScroll_div { + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; +} + +.result_tr{ + overflow-y: scroll; + overflow-x: scroll; +} + +.result_data{ + overflow-y: scroll; + overflow-x: scroll; + width: 50px; +} + +/* tablesoter */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; +} + +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 12pt; + padding: 4px; + padding-right: 20px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; +} +table.tablesorter tbody td div{ + float: right; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { + background-color: #8dbdd8; +} diff --git a/ecs/jskult-webapp/src/static/css/datepicker.css b/ecs/jskult-webapp/src/static/css/datepicker.css new file mode 100644 index 00000000..fb2f5217 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/datepicker.css @@ -0,0 +1,11 @@ +/* 日曜日:赤 */ +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-weekdays .flatpickr-weekday:nth-child(7n + 1), +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-days .flatpickr-day:not(.flatpickr-disabled):not(.prevMonthDay):not(.nextMonthDay):nth-child(7n + 1) { + color: red; +} + +/* 土曜日:青 */ +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-weekdays .flatpickr-weekday:nth-child(7), +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-days .flatpickr-day:not(.flatpickr-disabled):not(.prevMonthDay):not(.nextMonthDay):nth-child(7n) { + color: blue; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/loading.css b/ecs/jskult-webapp/src/static/css/loading.css new file mode 100644 index 00000000..8f081d29 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/loading.css @@ -0,0 +1,21 @@ +._loading { + z-index: 10000; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #FFF; + overflow-x: hidden; + overflow-y: auto; + outline: 0; + text-align: center; + display: none; + opacity: 0.7; +} + +._loading_content { + position: absolute; + top: 50%; + left: 50%; +} diff --git a/ecs/jskult-webapp/src/static/css/main_theme.css b/ecs/jskult-webapp/src/static/css/main_theme.css new file mode 100644 index 00000000..a6057540 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/main_theme.css @@ -0,0 +1,5 @@ +body { + /* Merck Sensitive Green */ + background-color: #B4DC96; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; +} diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css new file mode 100644 index 00000000..dd760425 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -0,0 +1,173 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +table { + box-sizing: initial; +} + +h1{ + margin-left : 1%; + font-weight: 700; +} + + +/*ヘッダー*/ +.headerTable{ + width: 100%; +} + +.headerTdLeft{ + width: 80%; +} + +.headerTdRight{ + text-align: right; + padding-right: 2%; + width: 20%; +} + +.header_buttonSize{ + width: 7rem; + font-size: initial; +} +.buttonSize{ + width: 85px; +} + +/*////////////////////////*/ +/*施設担当者データCSVダウンロード*/ +/*////////////////////////*/ +.searchColumnTd{ + width: 14%; +} + +.searchTextboxTd{ + width: 18%; +} + +.searchTable{ + margin-left: 3%; + margin-right: 3%; + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 94%; + border-collapse: initial; +} + +.searchLabelTd{ + text-align: right; + width: 10%; + +} + +.searchInputTd{ + width: 19%; +} + +.searchTextbox{ + width: 90%; + margin-left: 2.5%; + margin-right: 2.5%; + margin-top: 0.8%; + margin-bottom: 0.8%; +} + +.searchDateTextbox{ + width: 37%; + margin-left: 2.5%; + margin-right: 2.5%; + margin-top: 0.8%; + margin-bottom: 0.8%; +} + +.searchButtonTd{ + text-align: right; + padding-top: 1%; +} + + +.csvOutputMessage{ + margin-left: 3%; +} + +.errorColor{ + color: red; +} + +/*//////////////////////////*/ +/*施設担当者データCSVアップロード*/ +/*//////////////////////////*/ +.inputTable{ + margin-left: 3%; + margin-right: 3%; + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 94%; + border-collapse: initial; +} + +.inputLabelTd{ + width: 10%; +} + +.inputTd{ + width:20%; +} + +.inputButtonTd{ + width: 50%; + text-align: right; +} + +.dataCntDisp{ + text-align: right; + margin-right: 3%; +} + +table.inputData { + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; + white-space: nowrap; + border: 0.1px solid silver; + padding: 4px; + padding-right: 20px; + border-collapse: collapse; + margin-left: 3%; + width: 94%; +} +table.inputData tbody th { + color: #3D3D3D; + padding: 4px; + background-color: #e6EEEE; + border: 0.1px solid silver; + vertical-align: top; +} + +table.inputData tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; +} + +.footerMsg{ + margin-left: 3%; +} + + +/*//////////////////////////*/ +/*データ上書きコピー */ +/*//////////////////////////*/ +.tableOverRide{ + margin-right: 3%; + margin-left: 3%; + margin-bottom: 2%; + border-bottom: solid 1px gray; + width: 94%; + border-collapse: initial; +} + diff --git a/ecs/jskult-webapp/src/static/css/menuStyle.css b/ecs/jskult-webapp/src/static/css/menuStyle.css new file mode 100644 index 00000000..4d2f9c46 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/menuStyle.css @@ -0,0 +1,47 @@ +body{ + background-size: 220%,220%; +} + +.background{ + margin-top: 5%; + padding: 2%; + background-color: white; + width: 40%; + border-radius: 25px; + box-shadow:5px 5px rgba(0,0,0,0.4);; +} + +.btn_width { + width: 80%; +} + +.form_login{ + width: 80%; + font-size: 180%; + margin: 1%; +} + +.form_login::-webkit-input-placeholder{ + color: gray; +} +.form_login:-ms-input-placeholder{ + color: gray; +} +.form_login::-moz-placeholder{ + color: gray; +} + +.logout_p{ + font-size: 160%; +} + +.notUseBioMsg,.notUseMainteMsg{ + font-size: 143%; + color: red; +} + +.batchMsg{ + color: red; + font-size: 120%; + text-align: center; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/pagenation.css b/ecs/jskult-webapp/src/static/css/pagenation.css new file mode 100644 index 00000000..5af4353d --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/pagenation.css @@ -0,0 +1,74 @@ +.pagination { + position: relative; + padding-top: 10px; +} + +.paginationjs > .paginationjs-nav.J-paginationjs-nav{ + position: absolute; + right: 0; +} + +div.paginationjs-pages ul { + list-style: none; + padding: 0; + margin: 0; +} + +.paginationjs-pages > ul > li > a { + padding: 6px 9px; + color: white; + background-color: whitesmoke; + border: 1px solid #bbb; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) +} +.paginationjs-pages > ul > li > a:hover { + color: black; + background-color: white; + cursor: pointer; +} +.paginationjs-pages > ul > li.active > a { + color: white; + background-color: #666666; + box-shadow: none; +} +.paginationjs-pages > ul > li.active > a:hover { + color: white; + background-color: #666666; + cursor: text; +} +.paginationjs-pages > ul > li.disabled > a { + color: white; + background-color: #666666; + box-shadow: none; +} +.paginationjs-pages > ul > li.disabled > a:hover { + color: white; + background-color: #666666; + cursor: text; +} + +.paginationjs-page,.paginationjs-prev,.paginationjs-next { + text-decoration: underline; + margin: 0 4px; +} + +.paginationjs-page:hover,.paginationjs-prev:hover,.paginationjs-next:hover { + text-decoration: none; +} + +.paginationjs-page.active,.paginationjs-prev.disabled,.paginationjs-next.disabled { + text-decoration: none; +} + +.paginationjs-pages > ul { + display: flex; + align-items: baseline; +} +.paginationjs-pages > ul > li.paginationjs-ellipsis.disabled > a { + border: none; + background-color: inherit; + color: black; + margin: 0 4px; + padding: 0; +} diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css new file mode 100644 index 00000000..843a796b --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -0,0 +1,691 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +*, ::after, ::before { + box-sizing: revert; +} + +body { + margin: 8px; +} + +h1 { + font-size: 150%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; + font-weight: 700; +} + +table{ + border-collapse : collapse; +} + +.header_bt{ + width: 8%; + margin-bottom: 0.8%; + margin-left: 78.5%; +} + +.toMenu_bt{ + width: 130px; +} + +.search_textbox{ + width: 100%; +} + +.search_dropdown{ + width: 100%; + height: 1.8em; +} + +.search_longtextbox{ + width: 100% +} + +.instSearchResult { + width: 100%; +} + +.scroll_table{ + overflow: auto; + white-space: nowrap; + margin-top: 1%; + margin-bottom: 1%; + width: 100%; + height: 250px; +} + +.scroll_workhistory{ + width: 95%; + margin: 5px auto; +} + +.scroll_table::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.scroll_table::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.scroll_table::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.ult_bt { + width: 20%; + height: 80%; +} + +.info_bt{ + width: 120px; +} + +.search_bt{ + margin-left: 3%; + margin-top: 0.8%; + margin-bottom: 0.8%; + text-align: center; +} + +.notFind{ + margin-top: 5%; + text-align: center; + font-size: 150%; +} + +.search_table { + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 100%; +} + +.search_tb { + padding-right: 2%; + padding-top: 0.2%; + padding-bottom: 0.2%; +} + +.leftSearch_tb{ + width: 35%; +} + +.batchMsg{ + color: red; + font-size: 120%; + text-align: center; + +} + +._form { + width: 95%; + margin-left: 3%; +} + +.result_info { + text-align: right; +} + +/*施設検索一覧ヘッダー*/ +.instSearchHeaderTable{ + width: 100%; +} + +.instSearchHeaderTd{ + width: 24%; +} + +.instSearchHeaderTdCenter{ + text-align: center; + width: 50%; +} + +.instSearchHeaderTdRight{ + text-align: right; + padding-right: 120px; +} + +.instSearchButchMsg{ + /* font-size: 80%; */ + color: red; +} + +.instSearchHeader_bt{ + width: 40%; +} + + +/*施設詳細*/ +.instInfoTable{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 2%; + width: 93%; +} + +.instInfoTableHalf1{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + width: 93%; +} + +.instInfoTableHalf2{ + margin-top: -0.05%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 2%; + width: 93%; +} + +.instInfoColumn { + width : 9%; + height: 40px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.instData { + background : rgb(244, 244, 244); + border : solid 1px; + padding-left : 0.5%; + padding-right : 0.5%; + padding-top: 0.25%; + padding-bottom: 0.25%; +} + +.instDataMid{ + /*NO5修正前 width: 51%;*/ + width: 20%; +} + +/*NO5にて追加 START*/ +.instDataLarge{ + width: 85%; +} + +.instDataLeft{ + width: 20%; +} + +.instDataCenter{ + width: 10%; +} + +.instDataRight{ + width: 22%; +} +/*NO5にて追加 END*/ + +.instDataSmallTextbox{ + width: 45%; +} + +/*NO5にて追加 START*/ +.instDataCenterTextbox{ + width: 80%; +} +/*NO5にて追加 END*/ + +.instInfoTextbox{ + width: 98%; + padding-right: 1%; + padding-left: 1%; +} + +.instCdTextbox{ + /*NO5修正前 width: 13%;*/ + width: 35%; + margin-left: 0.5%; + margin-right: 2%; +} + +.delReasonCdTextbox{ + /*NO5修正前 width: 2%;*/ + width: 5%; + margin-left: 0.5%; + margin-right: 1%; +} + +.delReasonTextbox{ + /*NO5修正前 width: 43%;*/ + width: 88%; + margin-left: 0.5%; + margin-right: 2%; +} + +.manageTextbox{ + width: 40%; +} + +.textboxMargin { + margin-left : 0.1%; +} + +.transitionBt{ + width: 98%; + height: 30px; +} + +.pageMoveBt{ + min-width: 35px; +} + +.doctorSearchBt{ + min-width: 180px; +} + +.doctorInfoBt{ + min-width: 105px; +} + +.instSearchBt{ + min-width: 180px; +} + +.instHeaderTable{ + margin-left: 40%; +} + +.instHeaderTd{ + width: 10%; + font-size: 140%; + text-align: center; + padding-right: 2%; +} + +.trtCourseTextbox{ + width: 6%; +} + +.bedTd{ + width: 46%; +} + +.bedTextbox{ + width: 70%; +} + +.xSmallTd{ + width: 9%; +} + +.xSmallTextbox{ + width: 75%; +} + +.reExamTd{ + width: 13%; +} + +.repreTd{ + width: 50%; +} + +.repreTextbox{ + width: 95%; +} + +.trtTextbox{ + width: 5%; + margin-right: 1.2%; +} + +.parentCdTextBox{ + width: 15%; +} + +.parentNameTextBox{ + width: 75%; +} + +.hpInfoColumn{ + width : 12%; + height: 40px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.captionSickBed{ + width : 10%; +} + +.captionMenteDate{ + width: 10%; +} + +.menteDate{ + width: 14%; +} + +.menteDateTextbox{ + width: 85%; +} + +.hpAssrtTd{ + width: 12%; +} + +.hpAssrtTextbox{ + width: 85%; +} + +.border_bottom_none { + border-bottom-style:none; +} + +.numberBox{ + text-align: right; +} + +/*医師検索*/ +/*ヘッダー*/ +.docHeaderTable{ + width: 100%; +} + +.docHeaderTd{ + width: 24%; +} + +.docHeaderTdCenter{ + text-align: center; + width: 50%; +} + +.docHeaderTdRight{ + text-align: right; + padding-right: 120px; +} + +.docButchMsg{ + /* font-size: 80%; */ + color: red; +} + +.docHeader_bt{ + width: 40%; +} + +/* アルトマーク課題管理表No.2の修正 8% → 10% */ +/* アルトマーク課題管理表No.8の修正 10% → 14% */ +.docSearchColumnTd{ + width: 14%; +} + +.docSearchTextboxTd{ + width: 18%; +} + +.docSearchTextbox_td{ + width: 94%; +} + +.docSearchTextbox{ + width: 90%; + margin-right: 5%; + margin-top: 0.8%; + margin-bottom: 0.8%; +} + +.docSearchTableDivOne{ + width: 100%; +} + +.docSearchTableDivTwo{ + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 100%; +} + +.allOnOffButton{ + width: 75px; +} + +/*医師情報*/ +.docInfoTable{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 1%; + width: 93%; + border-bottom: solid 1px gray; +} + +.docInfoTd{ + padding-bottom: 0.5%; +} + +.docInfoTextBox{ + margin-left: 0.5%; + margin-right: 2%; + width: 8%; +} + +.docInfoTrtTextBox{ + margin-left: 0.5%; +} + +.docBelongTable{ + margin-left: 1%; + width: 98%; + border-bottom: solid 1px gray; +} + +.docBelongTd{ + width: 49%; + height: 150px; +} + +.docSocietyTable{ + width: 100%; +} + +.scroll{ + overflow: auto; + height: 120px; + width: 90%; + margin-left: 7%; + margin-bottom: 4%; +} + +.scroll::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.scroll::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.scroll::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.rightBoderLine{ + border-right: solid 1px gray; +} + +.wrkplaceH1{ + margin-top: 0.3%; +} + +.wrkplaceTable{ + width: 100%; +} + + + + + + + +/* 生物由来検索、施設検索共通*/ + + + +.clear_bt{ + margin-left: 120px; + width: 60px +} + +.back_bt{ + margin-left: 1042px; + width: 80px +} + +.noLine{ + text-decoration: none; +} + + +/*アルトマーク施設検索*/ + + +/*共通:アルトマーク施設検索,医師検索,施設詳細*/ +.maxWidth_tb { + width: 100%; +} + +/*アルトマーク施設検索,医師検索共通*/ + +.search_btTd { + text-align: right; +} + +.selection { + display: none; +} + +#page-1 { + display: block; +} + + +/*医師検索*/ +.search_middleTd { + padding-right: 25px; + width : 450px; +} + +/*共通:施設詳細、医師詳細*/ +.transition{ + text-align: right; + margin-right: 60px; +} + + + + + +.data_width_middle { + width : 300px; +} + + +.border_top_none { + border-top-style:none; +} + + + +.textbox_margin_short { + margin-left : 5px; +} + +.label_margin { + margin-left: 10px; + margin-right: 10px; +} + + +/*医師詳細*/ +.docInfo_table{ + margin-bottom: 30px; + border-bottom: solid 1px gray; + width: 1132px; +} + +.small_tb{ + width: 100px; +} + +.docBelongScroll_div { + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; +} + +.rightPadding_table{ + padding-right: 50px; +} + + +.docPlaceScroll_div { + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; +} + +.result_tr{ + overflow-y: scroll; + overflow-x: scroll; +} + +.result_data{ + overflow-y: scroll; + overflow-x: scroll; + width: 50px; +} + +/* tablesoter */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; +} + +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 12pt; + padding: 4px; + padding-right: 20px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { + background-color: #8dbdd8; +} diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js new file mode 100644 index 00000000..1ca36656 --- /dev/null +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -0,0 +1,319 @@ +// ローディング + +/** + * ローディングクラス + * @param {string} loading_elem_id ローディングのHTML要素 + */ +class Loading { + constructor(loadingElemId = '_loading') { + this.loadingElemId = loadingElemId; + // ロード中かどうか + this.isLoading = false; + } + + /** + * ローディングを開始する。
+ * 開始済みの場合と、ローディングの要素が見つからない場合は何もしない。 + */ + start() { + if (this.isLoading) + return; + + const loadingElem = document.getElementById(this.loadingElemId); + + if (loadingElem) { + this.isLoading = true; + loadingElem.style.display = 'block'; + } + } + + /** + * ローディングを停止する。
+ * 開始されていない場合と、ローディングの要素が見つからない場合は何もしない。 + */ + stop() { + if (!this.isLoading) + return; + + const loadingElem = document.getElementById(this.loadingElemId); + + if (loadingElem) { + this.isLoading = false; + loadingElem.style.display = 'none'; + } + } +} + + +/** + * ローダーを表示する + * @param {string} loadingElemId ローディング要素のID + */ +function showLoading(loadingElemId = '_loading') { + const loading = new Loading(loadingElemId); + loading.start(); +} + +// 汎用画面遷移 + +function transitionTo(link){ + // ローディング表示 + showLoading(); + location.href = link; + return false; +} + +// 検索フォーム + +// 戻るボタンの関数 +// 機能概要:メニュー画面に遷移する +function backToMenu(){ + // ローディング表示 + showLoading(); + location.href = "/menu/"; +} + +// クリアボタンの関数 +// 利用条件1:form名がsearch +// 利用条件2:form入力値名がctrl_で始まる +function clr() { + const formElement = document.search + const formInputElements = Array.from(formElement.elements) + for (const formInput of formInputElements) { + if (formInput.name.startsWith('ctrl_')) { + formInput.value = ""; + } + if (formInput.type === 'checkbox') { + formInput.checked = false; + } + } + + // 検索ボタンを再度非活性にする + formBtDisabled(); +} + +/** + * ボタンの活性非活性関数 + * @param {*} buttonId ボタンのID デフォルトは`search_bt` + * @param {*} formId フォームのname デフォルトは`search` + * @param {*} all 全インプットが入力されている場合に活性化するかどうか + */ +function formBtDisabled(buttonId='search_bt', formId='search', all=false) { + const formElement = document[formId] + const formInputElements = Array.from(formElement.elements) + // 検査対象を + const checkTargetValueLength = formInputElements + .filter((elem) => elem.name.startsWith('ctrl_')) + .map((elem) => elem.value.length) + + // 活性、非活性の判断 + let validFlg = false; + if (all) { + validFlg = checkTargetValueLength.every((num) => num !== 0) + } else { + validFlg = checkTargetValueLength.some((num) => num !== 0) + } + + if (validFlg == true) { + $(`#${buttonId}`).removeAttr('disabled'); + // クリアボタンはあれば活性化する + if ($('#clear')) { + $('#clear').removeAttr('disabled'); + } + } + else { + $(`#${buttonId}`).attr('disabled', 'disabled'); + // クリアボタンはあれば非活性化する + if ($('#clear')) { + $('#clear').attr('disabled', 'disabled'); + } + } +} + +// ドロップダウンリスト再選択の関数 +// 引数:ドロップダウンリストのID +// 引数:選択したいリスト選択表示文字列 +function selectDropDowList(id, selectedName){ + // 以前の検索条件再読み込み + var select = document.getElementById(id); + select = select.children[0]; + var options = select.options; + if (options != null) + { + for(var i = 0; i < options.length; i++){ + if(options[i].text === selectedName){ + options[i].selected = true; + } + }; + } +} + +/** + * DatePickerを設定 + */ +function enableDatePicker() { + // カレンダーの表示を日曜日始まりに変更 + flatpickr.l10ns.ja.firstDayOfWeek = 0; + + $(".date_picker").each(function(i, elem) { + const date_picker_name = elem.name; + + flatpickr(elem, { + locale: 'ja', // 日本語カレンダー + allowInput: true, // 入力可能にする + dateFormat: "YYYY/MM/DD", // 日付のフォーマット + onChange(_dates, currentDateString, _picker, _data) { + }, + parseDate: function(strFormat, format) { + + // yyyyMMddの場合→yyyy/MM/dd + const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); + if (datePatternMatches){ + strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; + } + + // yyyy/00/00~yyyy/00/00の場合→yyyy/01/01~yyyy/12/31 + // yyyy/MM/00~yyyy/MM/01の場合→yyyy/MM/01~yyyy/MM/末日 + // 開始日の場合 + if (date_picker_name.includes('from')){ + strFormat = strFormat.replace("/00/00", "/01/01"); + strFormat = strFormat.replace("/00", "/01"); + } + // 終了日の場合 + else if (date_picker_name.includes('to')){ + strFormat = strFormat.replace("/00/00", "/12/31"); + const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); + strFormat = strFormat.replace("/00", "/"+date.toString()); + } + return new Date(strFormat); + }, + formatDate: (date, format) => { + // 日付の整合性チェック、不正の場合は空表示 + if(isNaN(date.getDate())){ + return; + } + + // フォーマットを設定 + const formatted = flatpickr.formatDate(date,'Y/m/d'); + return formatted; + + } + }) + }); +} + +// 前のスペースを許さない入力チェック +function checkSpaceForm($this) +{ + var str=$this.value; + + while(str.match(/(^\s+)/g)) + { + str=str.replace(/(^\s+)/g, ""); + } + + $this.value=str; +} + +// あいまい検索用に半角の英数字と%以外を許さない入力チェック +function checkAimaiSearhForm($this) +{ + var str=$this.value; + while(str.match(/[^A-Z^a-z^0-9\%]/)) + { + str=str.replace(/[^A-Z^a-z^0-9\%]/,""); + } + $this.value=str; +} + +// 大文字小文字-以外を許さない入力チェック +function checkPassForm($this) +{ + var str=$this.value; + while(str.match(/[^ -\~]/)) + { + str=str.replace(/[^ -\~]/,""); + } + $this.value=str; +} + +// チェックボックス全選択関数 +// 条件:チェックボックスのクラス名に"selected"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function allOn(){ + $(".selected").prop("checked", true); + $(".send").prop('disabled',false); +} + +// チェックボックス全解除関数 +// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function allOff(){ + $(".selected").prop("checked", false); + $(".send").prop('disabled',true); +} + +// 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数 +// 条件:チェックボックスのクラス名に"selected"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function resultBtDisablead(){ + var cnt1 = $('.checkNum input:checkbox:checked').length; + console.log(cnt1); + if(cnt1 == 0) { + $(".send").prop('disabled',true); + } + else { + $(".send").prop('disabled',false); + } +} + +// 数字-以外を許さない入力チェック +function checkNumberForm($this) +{ + var str=$this.value; + while(str.match(/[^\d\-]/)) + { + str=str.replace(/[^\d\-]/,""); + } + $this.value=str; +} + +// 数字以外を許さない入力チェック +function checkNumberOnlyForm($this) +{ + var str=$this.value; + while(str.match(/[^\d]/)) + { + str=str.replace(/[^\d]/,""); + } + $this.value=str; +} + +// メニューへボタンの関数 +// 機能概要:マスターメンテメニュー画面に遷移する +function backToMainteMenu(loadingElemId = '_loading'){ + sessionStorage.clear(); + // ローディング表示 + showLoading(loadingElemId); + location.href = "/masterMainte/masterMainteMenu"; +} + +// 確認ダイアログ +function confirmDialog(strMesssage) { + var result = confirm(strMesssage); + return result; +} + +function formInsertBtDisabled(){ + var validFlg = false; + if(document.getElementById("csvFile").value === ""){ + validFlg = true; + } + + if (validFlg == true) { + document.getElementById("confirm").disabled = true; + } + else { + document.getElementById("confirm").disabled = false; + } +} diff --git a/ecs/jskult-webapp/src/static/img/icon_modal_confirm.png b/ecs/jskult-webapp/src/static/img/icon_modal_confirm.png new file mode 100644 index 00000000..e5c68f4d Binary files /dev/null and b/ecs/jskult-webapp/src/static/img/icon_modal_confirm.png differ diff --git a/ecs/jskult-webapp/src/static/img/icon_modal_error.png b/ecs/jskult-webapp/src/static/img/icon_modal_error.png new file mode 100644 index 00000000..a4a0cbba Binary files /dev/null and b/ecs/jskult-webapp/src/static/img/icon_modal_error.png differ diff --git a/ecs/jskult-webapp/src/static/lib/fixed_midashi.js b/ecs/jskult-webapp/src/static/lib/fixed_midashi.js new file mode 100644 index 00000000..f386d1b9 --- /dev/null +++ b/ecs/jskult-webapp/src/static/lib/fixed_midashi.js @@ -0,0 +1,165 @@ +/* + * FixedMidashi JavaScript Library, version 1.11 (2018/12/03) + * http://hp.vector.co.jp/authors/VA056612/fixed_midashi/ + * Copyright (C) 2012-2018 K.Koiso + */ + +/* Exsample */ +/******************************************************************* + + + + + + ... + + + + +
+
+ ... +*******************************************************************/ + +var FixedMidashi = new function() +{ + +var DISABLED = false; + +var ROWS = 1; +var COLS = 0; +var DIV_FULL_MODE = false; +var DIV_AUTO_SIZE = "both"; // both | width | height | none +var COPY_ID = true; +var BORDER_COLOR = null; +var BORDER_STYLE = null; +var BORDER_WIDTH = null; +var BOX_SHADOW = null; + +var DIV_MIN_WIDTH = 150; +var DIV_MIN_HEIGHT = 150; + +var DIV_BODY_SCROLL = 1; + +var RADIO_PREFIX = "_FIXED_HEADER_"; + +var POS_FIXED = 1; +var POS_ABSOLUTE = 2; +var POS_MIX = 3; +var _positionMode = -1; + +var h="checkbox",f="select-multiple",e="select-one",g="change",m="radio",l="INPUT",cc="fixed",bc="transparent",ac="0px",Zb="absolute",Yb="none",Xb="hidden",Wb="auto",Vb="",I="class",Ub="THEAD",Tb="scroll",n="resize",Sb=-1,Rb=null,Qb=true,Pb="both",Ob=false,Nb=this; + +var TIMER_WATCH_TABLESIZE=3e3,TID_HEADER="H",TID_NUMBER="N",TID_CORNER="C",PX="px",HEIGHT_MARGIN=10,MIN_SIZE=1,_isIE=Ob,_IEver=0,_isIE11=Ob,_isFirefox=Ob,_isOpera=Ob,_isSafari=Ob,_isChrome=Ob,_isMobile=Ob,_isBackCompat=Ob,_fixedHeaders=Rb,_fixedList=Rb,_body=Rb,_resizeTimerId=Rb,_execFlag=Ob,_IE_retryCount=0; + +Nb.create=function(){var f="_fixedhead";if(DISABLED)return Sb;if(!document.body.getBoundingClientRect)return -2;if(!window.addEventListener&&!window.attachEvent)return -3;var l=(new Date).getTime(),h=_fixedHeaders==Rb;if(!h)for(var b=0;b<_fixedHeaders.length;b++)_fixedHeaders[b].removeAllTables(Ob);for(var i=document.body.getElementsByTagName("TABLE"),e=[],b=0;b=0;if(_isIE){var j=a.indexOf("msie"),m=a.indexOf(";",j);_IEver=Number(a.substring(j+5,m))}if(!_isIE)_isIE11=a.indexOf("trident")>=0;_isFirefox=a.indexOf("firefox")>=0;_isOpera=a.indexOf("opera")>=0;_isSafari=a.indexOf("safari")>=0&&a.indexOf("chrome")<0;_isChrome=a.indexOf("chrome")>=0;_isMobile=a.indexOf("mobile")>=0;if(_isIE&&_rect(i[0]).right>=1e4&&_IE_retryCount<10){setTimeout(FixedMidashi.create,10);_IE_retryCount++;return -5}_isBackCompat=document.compatMode=="BackCompat";_body=_isBackCompat?document.body:document.documentElement;if(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat))_positionMode=POS_ABSOLUTE;else if(_positionMode==Sb){_positionMode=POS_MIX;if(_isMobile)_positionMode=POS_FIXED}if(_isIE&&_IEver==8&&!_isBackCompat)_fixedList=new _FixedElementList;if(_isFirefox)g=_createObjectForFirefox();_isChrome&&_createObjectForChrome();_addEventListener(window,n,_onBodyResize);_isMobile&&_addEventListener(window,"orientationchange",_onBodyResize);(_isFirefox||_isSafari)&&!_isMobile&&TIMER_WATCH_TABLESIZE>=0&&setInterval(_checkZoom,TIMER_WATCH_TABLESIZE);_addEventListener(window,Tb,_onBodyScroll)}_fixedHeaders=[];for(var b=0;b=Math.min(B.length,11))d=0;if(j<0||j>=Math.min(r,11))j=0;if(!c||c<1||c>100)c=Sb;if(!b||b<1||b>100)b=Sb;if(F>1)s=Ob;if(m<0||m>1)m=1;var n=document.createElement("DIV");if(f!=Rb&&!_setStyle(n,"borderColor",f))f=Rb;if(g!=Rb&&!_setStyle(n,"borderStyle",g))g=Rb;if(h!=Rb&&!_setStyle(n,"borderWidth",h))h=Rb;if(i!=Rb&&!_setStyle(n,"boxShadow",i))i=Rb;if(l!=Rb&&!_setStyle(n,"backgroundColor",l))l=Rb;var w=Rb,x=Rb;if(p!=Rb&&!(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat)))w=document.getElementById(p);if(q!=Rb&&!(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat)))x=document.getElementById(q);var y=Rb;if(k.parentNode.tagName=="DIV"){var u=k.parentNode,o=u.currentStyle||document.defaultView.getComputedStyle(u,Vb);if(o.overflowX==Wb||o.overflowX==Tb||(o.overflowY==Wb||o.overflowY==Tb))y=u}return new _FixedHeader(y,k,r,d,j,c,b,s,v,z,C,f,g,h,i,l,m,w,x)}function + _onBodyScroll(){for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].onBodyScroll()}function + _onBodyResize(){if(_execFlag)return;_resizeTimerId!=Rb&&clearTimeout(_resizeTimerId);var a=function(){_execute(n)}; +_resizeTimerId=setTimeout(a,500)}function + _execute(b){_execFlag=Qb;_resizeTimerId=Rb;for(var a=0;a<_fixedHeaders.length;a++)if(b==n)_fixedHeaders[a].initOnResize();else _fixedHeaders[a].init();_resizeSourceDiv();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].main();_execFlag=Ob}function + _resizeSourceDiv(){for(var b=Ob,a=0;a<_fixedHeaders.length;a++)if(_fixedHeaders[a].hideAllDivs(Qb))b=Qb;if(!b)return;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeSourceDiv1();var d=document.body.style.overflowX,c=document.body.currentStyle||document.defaultView.getComputedStyle(document.body,Vb);if(_body.scrollWidth<=_body.clientWidth&&c.overflowX!=Tb)document.body.style.overflowX=Xb;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeDivHeight();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeDivWidth();document.body.style.overflowX=d;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeSourceDiv2();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].hideAllDivs(Ob)}function + _FixedHeader(a,d,E,p,y,v,B,xb,Z,F,G,J,K,L,zb,Q,bb,M,N){var o="CLIENT",j="TBODY",g="1px",q=this,f=a!=Rb,b=Rb,c=Rb,e=Rb,rb=0,qb=0,hb=Vb,gb=Vb,U=Rb,W=Rb,u=[],yb=[],Y=0,fb=0,Cb=d.style.zIndex?d.style.zIndex:0,r=Ob,x=Ob,k=0,n=0,R=0,S=0,ib=0,mb=0,lb=0,ob=0,eb=0,db=0,X=0,Ib=d.style.display,jb=Sb,nb=Sb,m=Rb,z=Sb,A=Sb,i=0,l=0,V=Rb,T=Rb; +q.init=function(){if(Q==Rb){var e=f?a:d,b=_getBackgroundColor(e);if(b==Rb){var c=e.parentNode;while(c){b=_getBackgroundColor(c);if(b!=Rb)break;if(c.tagName=="HTML")break;c=c.parentNode}if(b==Rb)b="white"}Q=b}if(f){_addEventListener(a,Tb,ab);Jb();X=_offsetWidth(d)}if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);wb()}; +q.initOnResize=function(){A=Sb;z=Sb;nb=Sb;jb=Sb;if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);if(f){if(r||v>0)a.style.width=Vb;if(x||B>0)a.style.height=Vb;X=_offsetWidth(d)}wb()}; +q.removeAllTables=function(d){b&&w(b);c&&w(c);e&&w(e);b=Rb;c=Rb;e=Rb;if(f){_removeEventListener(a,Tb,ab);if(d){if(r||v>0)a.style.width=Vb;if(x||B>0)a.style.height=Vb}}}; +q.hideAllDivs=function(h){if(!f)return Ob;var d=b==Rb?Rb:b.parentNode,g=c==Rb?Rb:c.parentNode,j=e==Rb?Rb:e.parentNode;if(h){d&&I(d,DIV_MIN_WIDTH);g&&H(g,DIV_MIN_HEIGHT)}var i=h?Yb:Vb;if(d)d.style.display=i;if(g)g.style.display=i;if(j)j.style.display=i;(r||x||v>0||B>0)&&Fb(h);if(h){r&&t(a,DIV_MIN_WIDTH);x&&D(a,DIV_MIN_HEIGHT)}return Qb}; +q.resizeSourceDiv1=function(){if(!f)return;var e=m!=Rb?m:d;if(v>0){k=_body.clientWidth/100*v;k=Math.max(k,DIV_MIN_WIDTH);var c=_offsetWidth(e)+eb;c=Math.min(c,k);t(a,c)}if(B>0){n=_body.clientHeight/100*B;n=Math.max(n,DIV_MIN_HEIGHT);var b=_offsetHeight(e)+db;b=Math.min(b,n);D(a,b)}}; +q.resizeDivHeight=function(){if(!f)return;if(!x)return;if(_body.scrollHeight>_body.clientHeight){var e=Math.max(_body.scrollHeight-_body.clientHeight,0);a.style.height=Math.max(_body.clientHeight-30,MIN_SIZE)+PX;var g=Math.max(_body.scrollHeight-_body.clientHeight,0);n=_offsetHeight(a)-(g-e)}else{a.style.height=_body.clientHeight+PX;var h=Math.max(_body.scrollHeight-_body.clientHeight,0);n=_offsetHeight(a)-h}n--;n=Math.max(n,DIV_MIN_HEIGHT);var c=m!=Rb?m:d,b=_offsetHeight(c)+db;b=Math.min(b,n);if(xb)b=n;D(a,b)}; +q.resizeDivWidth=function(){if(!f)return;if(!r)return;if(_body.scrollWidth>_body.clientWidth){var e=Math.max(_body.scrollWidth-_body.clientWidth,0);a.style.width=Math.max(_body.clientWidth-16,MIN_SIZE)+PX;var g=Math.max(_body.scrollWidth-_body.clientWidth,0);k=_offsetWidth(a)-(g-e)}else{a.style.width=_body.clientWidth+PX;var h=Math.max(_body.scrollWidth-_body.clientWidth,0);k=_offsetWidth(a)-h}k--;k=Math.max(k,DIV_MIN_WIDTH);var c=m!=Rb?m:d,b=_offsetWidth(c)+eb;b=Math.min(b,k);if(xb)b=k;if(_isIE)b--;t(a,b)}; +q.resizeSourceDiv2=function(){if(!f)return;var b=m!=Rb?m:d;if((r||v>0)&&a.scrollWidth>a.clientWidth&&_offsetWidth(a)0)&&a.scrollHeight>a.clientHeight&&_offsetHeight(a)0)&&X>_offsetWidth(b)&&_offsetWidth(a)=1||Math.abs(_offsetHeight(d)-qb)>=1||_colsWidthList(_cells(d.rows[0]))!=hb||_rowsHeightList(d.rows)!=gb)return Qb}; +q.main=function(){var h=_offsetWidth(d),g=_offsetHeight(d),b=rb!=h,a=qb!=g;rb=h;qb=g;var c=_colsWidthList(_cells(d.rows[0]));if(hb!=c){hb=c;b=Qb}var e=_rowsHeightList(d.rows);if(gb!=e){gb=e;a=Qb}var i=Gb(b||a);(i||b||a)&&Hb();f&&Lb();if(f){ub();ab()}else kb(Qb)}; +function Gb(l){if(l){b!=Rb&&w(b);c!=Rb&&w(c);e!=Rb&&w(e);b=Rb;c=Rb;e=Rb}var i=Ob,j=d.rows,k=f?d.parentNode:_body,h=Ob,g=Ob;if(f){h=a.clientHeight0&&h)if(_rowsHeight(j,p)+30>=k.clientHeight)h=Ob;if(y>0&&g){var m=_cells(j[0]);if(_colsWidth(m,y)+30>=k.clientWidth)g=Ob}if(y>0&&g){if(c==Rb){c=pb(TID_NUMBER,j.length,y);if(c!=Rb)i=Qb}}else if(c!=Rb){w(c);c=Rb}if(p>0&&h){if(b==Rb){b=pb(TID_HEADER,p,E);if(b!=Rb)i=Qb}}else if(b!=Rb){w(b);b=Rb}if(b!=Rb&&c!=Rb){if(e==Rb){e=pb(TID_CORNER,p,y);i=Qb}}else if(e!=Rb){w(e);e=Rb}return i}function + Hb(){if(b!=Rb){t(b,_offsetWidth(d));cb(b)}if(c!=Rb){var g=_colsWidth(_cells(d.rows[0]),y),f=_colsWidth(_cells(c.rows[0]),y),a=f-g;a!=0&&t(c,_offsetWidth(c)-a);cb(c);D(c,_offsetHeight(d))}if(e!=Rb){t(e,_offsetWidth(c));cb(e);D(e,_offsetHeight(b))}}function + Lb(){var j=1,d=b==Rb?Rb:b.parentNode,f=c==Rb?Rb:c.parentNode,g=e==Rb?Rb:e.parentNode;d!=Rb&&s(d);f!=Rb&&s(f);g!=Rb&&s(g);if(d!=Rb){I(d,a.clientWidth);H(d,_offsetHeight(b));var i=_rect(b).bottom-_rect(d).bottom;i>0&&H(d,_offsetHeight(b)+i);d.clientHeight>=a.clientHeight&&H(d,a.clientHeight-j)}if(f!=Rb){H(f,a.clientHeight);I(f,_offsetWidth(c));var h=_rect(c).right-_rect(f).right;h>0&&I(f,_offsetWidth(c)+h);f.clientWidth>=a.clientWidth&&I(f,a.clientWidth-j)}if(g!=Rb){H(g,d.clientHeight);I(g,f.clientWidth)}}function + Jb(){var b=a.cloneNode(Ob),c=d.cloneNode(Ob);b.style.position=Zb;b.style.left=ac;b.style.top=ac;b.style.minWidth=g;b.style.minHeight=g;a.parentNode.appendChild(b);var e=document.createElement("DIV");e.style.position=Zb;e.style.left=ac;e.style.top=ac;a.parentNode.appendChild(e);var i=_rect(a),f=_rect(b);S=i.top-f.top;R=i.left-f.left;c.style.width="50px";c.style.height="50px";var k=document.createElement(j),m=document.createElement("TR"),l=document.createElement("TD");l.appendChild(document.createTextNode("x"));m.appendChild(l);k.appendChild(m);c.appendChild(k);var o=b.offsetWidth,n=b.offsetHeight;b.appendChild(c);r=b.offsetWidth!=o;x=b.offsetHeight!=n;if(r){if(v>0||Z!=Pb&&Z!="width")r=Ob}else v=Sb;if(x){if(B>0||Z!=Pb&&Z!="height")x=Ob}else B=Sb;eb=_offsetWidth(b)-_offsetWidth(c);db=_offsetHeight(b)-_offsetHeight(c);var h=_rect(e);mb=f.top-h.top;ib=f.left-h.left;ob=_rect(c).top-f.top;lb=_rect(c).left-f.left;b.parentNode.removeChild(b);e.parentNode.removeChild(e)}function + wb(){if(p==0&&y==0)return;var a=d.cloneNode(Ob);a.style.position=Zb;a.style.left=ac;a.style.top=ac;a.style.width=Wb;a.style.height=Wb;a.width=Vb;a.height=Vb;var i,m=_getElementByTagName(d,Ub);if(m==Rb)m=_getElementByTagName(d,j);if(m!=Rb)i=m.cloneNode(Ob);else i=document.createElement(j);a.appendChild(i);d.parentNode.appendChild(a);for(var x=Kb(),v=p>0?p:1,t=d.rows,q=0,c=0;c0)u[h]=Math.min(u[h],k);fb=Math.max(u[h],fb)}a.parentNode.removeChild(a)}function + Kb(){for(var g=p>0?p:1,l=d.rows,f=new Array(g),b=0;b=i.length)break;var e=i[h];if(e.rowSpan>=2&&e.colSpan>=2)for(var c=0;c=g)break;for(var j=0;j=2)for(var c=1;c=g)break;f[b+c][a]=Ob}if(e.colSpan>=2)for(var c=1;c=i.length)break;var e=i[h];e.$FXH_COLINDEX=a;if(e.colSpan==1)k[a]=Qb;h++}return k}function + pb(e,v,x){var n=" fixed_header_display_none_at_print",c=d.cloneNode(Ob),r=_getElementByTagName(d,"CAPTION"),s=_getElementByTagName(d,Ub),u=_getElementByTagName(d,j),k=Rb,p=Rb,o=Rb;if(r!=Rb){k=r.cloneNode(Qb);k.style.backgroundColor=Q;k.style.overflow=Xb;if(e!=TID_HEADER){k.innerHTML=" ";k.style.height=_offsetHeight(r)+PX;k.style.backgroundColor=bc}c.appendChild(k)}var t=0;if(s!=Rb){p=s.cloneNode(Ob);c.appendChild(p);t=s.rows.length}if(u!=Rb&&t=t.length)break;var a=t[l];l++;if(c+a.rowSpan>x)return Ob;f[e]=c+a.rowSpan;if(a.colSpan>=2){for(var h=1;hq)return Ob}_radioCtl(a,"backup");var j=a.cloneNode(Qb);_radioCtl(a,"restore");_linkElement(j,a,g,F,G,Qb);b.appendChild(j);try{var o=c+"."+a.cellIndex;if(u[o]!=undefined){var D=u[o]+yb[o];j.style.width=_offsetWidth(a)-D+PX}else if(_isIE&&_IEver<=8&&a.colSpan>=2)j.style.width=a.clientWidth-fb+PX}catch(E){}var i=j.style;if(c+a.rowSpan==p&&g!=TID_NUMBER){if(J!=Rb)i.borderBottomColor=J;if(K!=Rb)i.borderBottomStyle=K;if(L!=Rb)i.borderBottomWidth=L}if(e+a.colSpan==y&&g!=TID_HEADER){if(J!=Rb)i.borderRightColor=J;if(K!=Rb)i.borderRightStyle=K;if(L!=Rb)i.borderRightWidth=L}e+=a.colSpan}if(_isIE&&_IEver<=9&&l==0){b.style.height=ac;var A=_rect(k).bottom,m=b.parentNode;if(m.tagName!="TABLE")m=m.parentNode;var r=m.rows,n=c-1;while(r[n].style.height==ac)n--;var B=A-_rect(s[n]).top;r[n].style.height=B-Y+PX}}_radioCtl(v,"sync");return Qb}function + s(b){if(b.style.position==cc)return;var f=_rect(a),e=_rect(b),d=e.top-f.top,c=e.left-f.left;if(_isIE){if(d==Sb&&b.$TOP_DIFF==1)d=0;else b.$TOP_DIFF=d;if(c==Sb&&b.$LEFT_DIFF==1)c=0;else b.$LEFT_DIFF=c}if(Math.abs(d)>=1)b.style.top=_pixel(b.style.top)-d+PX;if(Math.abs(c)>=1)b.style.left=_pixel(b.style.left)-c+PX}function + w(a){if(f)a=a.parentNode;_unlinkElement(a);a.parentNode&&a.parentNode.removeChild(a)} +q.onBodyScroll=function(){if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);if(f){ub();return}if(_positionMode==POS_ABSOLUTE){if(!_isMobile){if(_getBodyScrollTop()!=A){h(b,Ob);h(e,Ob)}if(_getBodyScrollLeft()!=z){h(c,Ob);h(e,Ob)}}V!=Rb&&clearTimeout(V);V=setTimeout(kb,200)}else kb()}; +function kb(k){V=Rb;var j=_getBodyScrollTop()!=A,g=_getBodyScrollLeft()!=z;A=_getBodyScrollTop();z=_getBodyScrollLeft();if(j&&g)k=Qb;var f=_rect(d),o=b!=Rb&&f.top=b.offsetHeight+i,p=c!=Rb&&f.left=c.offsetWidth+l;b!=Rb&&h(b,o);c!=Rb&&h(c,p);e!=Rb&&h(e,o&&p);if(_positionMode==POS_MIX&&b!=Rb){var a=b.style;if(k||j&&a.position==Zb){a.position=cc;a.left=f.left+PX;a.top=i+PX;if(e!=Rb)e.style.top=a.top;O(Ob)}else if(!j&&g&&a.position==cc){a.position=Zb;a.left=z+f.left+PX;a.top=A+i+PX;vb()}}if(_positionMode==POS_MIX&&c!=Rb){var a=c.style;if(k||g&&a.position==Zb){a.position=cc;a.left=l+PX;a.top=f.top+PX;P(Ob)}else if(!g&&j&&a.position==cc){a.position=Zb;a.left=z+l+PX;a.top=A+f.top+PX;tb()}}if(_positionMode==POS_FIXED){if(b!=Rb&&g)b.style.left=f.left+PX;if(c!=Rb&&j)c.style.top=f.top+PX;if(b!=Rb&&b.style.top!=i+PX){b.style.top=i+PX;if(e!=Rb)e.style.top=b.style.top}}if(_positionMode==POS_ABSOLUTE&&k){if(b!=Rb)b.style.left=z+f.left+PX;if(c!=Rb)c.style.top=A+f.top+PX}if(_positionMode==POS_ABSOLUTE&&(j||g)){var n,m,q=_isMobile?1:4;if(b!=Rb&&j){b.style.top=i+A-_offsetHeight(b)+PX;if(e!=Rb)e.style.top=b.style.top;n=_offsetHeight(b)/q}if(c!=Rb&&g){c.style.left=l+z-_offsetWidth(c)+PX;if(e!=Rb)e.style.left=c.style.left;m=_offsetWidth(c)/q}T!=Rb&&clearTimeout(T);sb(j,g,n,m)}b!=Rb&&g&&O(Ob);c!=Rb&&j&&P(Ob)}function + sb(m,j,k,h){T=Rb;var g=_getBodyScrollTop()+i,f=_getBodyScrollLeft()+l,d=g,a=f;if(b!=Rb&&m){d=_pixel(b.style.top)+k;if(k>0)d=Math.min(d,g);else d=Math.max(d,g);b.style.top=d+PX;if(e!=Rb)e.style.top=b.style.top}if(c!=Rb&&j){a=_pixel(c.style.left)+h;if(h>0)a=Math.min(a,f);else a=Math.max(a,f);c.style.left=a+PX;if(e!=Rb)e.style.left=c.style.left}if(g==d&&f==a){if(b!=Rb&&m){vb();if(e!=Rb)e.style.top=b.style.top}if(c!=Rb&&j){tb();if(e!=Rb)e.style.left=c.style.left}return}var n=function(){sb(m,j,k,h)}; +T=setTimeout(n,20)}function + ub(){if(DIV_BODY_SCROLL==0)return;if(_positionMode==POS_ABSOLUTE)return;var f=b==Rb?Rb:b.parentNode,g=c==Rb?Rb:c.parentNode,j=e==Rb?Rb:e.parentNode,k=_rect(a),o=_rect(d),p=0;if(_isIE11)p=1;var m=Ob,n=Ob;if(f&&(DIV_BODY_SCROLL==2||a.scrollHeight-p<=a.clientHeight)){var q=Math.min(k.bottom,o.bottom);if(k.top=_offsetHeight(b)){if(f.style.position!=cc){f.style.position=cc;f.style.top=i-mb-ob+PX}f.style.left=k.left-ib+PX;h(f,Qb);m=Qb}else{if(f.style.position!=Zb){f.style.position=Zb;f.style.top=S+PX;f.style.left=R+PX}h(f,a.scrollTop>0);s(f)}C(f)&&O(Ob)}if(g&&(DIV_BODY_SCROLL==2||a.scrollWidth<=a.clientWidth)){var r=Math.min(k.right,o.right);if(k.left=_offsetWidth(c)){if(g.style.position!=cc){g.style.position=cc;g.style.left=l-ib-lb+PX}g.style.top=k.top-mb+PX;h(g,Qb);n=Qb}else{if(g.style.position!=Zb){g.style.position=Zb;g.style.top=S+PX;g.style.left=R+PX}h(g,a.scrollLeft>0);s(g)}C(g)&&P(Ob)}if(j){if(m||n){if(j.style.position!=cc)j.style.position=cc;if(m)j.style.top=f.style.top;else j.style.top=g.style.top;if(n)j.style.left=g.style.left;else j.style.left=f.style.left}else if(j.style.position!=Zb){j.style.position=Zb;j.style.top=S+PX;j.style.left=R+PX;s(j)}h(j,C(f)&&C(g))}}function + ab(){var d=b==Rb?Rb:b.parentNode,f=c==Rb?Rb:c.parentNode,g=e==Rb?Rb:e.parentNode,i=d&&d.style.position==cc,k=f&&f.style.position==cc;h(d,a.scrollTop>0||i);h(f,a.scrollLeft>0||k);h(g,C(d)&&C(f));d!=Rb&&s(d);f!=Rb&&s(f);g!=Rb&&s(g);var j=a.scrollLeft!=jb,l=a.scrollTop!=nb;jb=a.scrollLeft;nb=a.scrollTop;if(d!=Rb&&j){d.$FXH_SCROLL_LEFT=a.scrollLeft;d.scrollLeft=a.scrollLeft;d.scrollLeft>0&&O(Ob)}if(f!=Rb&&l){f.$FXH_SCROLL_TOP=a.scrollTop;f.scrollTop=a.scrollTop;f.scrollTop>0&&P(Ob)}}function + Eb(b,c){if(c==TID_HEADER){if(Math.abs(b.scrollLeft-b.$FXH_SCROLL_LEFT)<5)return}else if(Math.abs(b.scrollTop-b.$FXH_SCROLL_TOP)<5)return;if(c==TID_HEADER)a.scrollLeft=b.scrollLeft;else a.scrollTop=b.scrollTop}function + vb(){if(b==Rb)return;var a=_rect(b);if(a.top<=i)return;b.style.top=i+_pixel(b.style.top)-a.top+PX}function + tb(){if(c==Rb)return;var a=_rect(c);if(a.left<=l)return;c.style.left=l+_pixel(c.style.left)-a.left+PX}function + O(q){if(b==Rb)return;if(!q){U!=Rb&&clearTimeout(U);U=setTimeout(function(){O(Qb)},200);return}U=Rb;var h,j;if(f){h=_rect(a).left;j=h+a.clientWidth}else{h=0;j=_body.clientWidth}if(C(c))h+=_offsetWidth(c);for(var m=_cells(d.rows[0]),o=_cells(b.rows[0]),e=0,l=0,i=0;ij)break;var p=_rect(o[i]).left;e+=p-k;l++}if(l==0)return;if(e==0)return;e=e/l;e=Math.round(e);if(e==0)return;if(f){var g=b.parentNode;if(g.style.position==cc){var n=_pixel(g.style.left)-e;g.style.left=n+PX}else{g.$FXH_SCROLL_LEFT=g.scrollLeft+e;g.scrollLeft+=e}}else{var n=_pixel(b.style.left)-e;b.style.left=n+PX}}function + P(p){if(c==Rb)return;if(_isOpera)return;if(!p){W!=Rb&&clearTimeout(W);W=setTimeout(function(){P(Qb)},200);return}W=Rb;var h,j;if(f){h=_rect(a).top;j=h+a.clientHeight}else{h=0;j=_body.clientHeight}if(C(b))h+=_offsetHeight(b);for(var n=d.rows,m=c.rows,e=0,l=0,i=0;ij)break;if(_cells(m[i]).length==0)continue;var q=_rect(m[i]).top;e+=q-k;l++}if(l==0)return;if(e==0)return;e=e/l;e=Math.round(e);if(e==0)return;if(f){var g=c.parentNode;if(g.style.position==cc){var o=_pixel(g.style.top)-e;g.style.top=o+PX}else{g.$FXH_SCROLL_TOP=g.scrollTop+e;g.scrollTop+=e}}else{var o=_pixel(c.style.top)-e;c.style.top=o+PX}}function + C(a){return a!=Rb&&a.style.visibility=="visible"}function + h(a,b){if(a==Rb)return;var c=b?"visible":Xb;if(a.style.visibility==c)return;a.style.visibility=c;if(_isIE)a.style.zIndex=b?Cb:Cb-1;if(_isOpera)a.style.opacity=b?bb:0;if(b&&bb<1){a.style.opacity=bb;a.style.filter="alpha(opacity="+bb*100+")"}}function + Fb(b){if(!_isIE&&!_isIE11&&!_isFirefox&&!_isOpera)return;if(b){m=Db();a.appendChild(m);t(m,_offsetWidth(d));D(m,_offsetHeight(d));d.style.display=Yb}else{d.style.display=Ib;a.removeChild(m);m=Rb}}function + Db(){var a=d.cloneNode(Ob),b=document.createElement(j),e=document.createElement("TR"),c=document.createElement("TD");c.appendChild(document.createTextNode("dummy"));e.appendChild(c);b.appendChild(e);a.appendChild(b);return a}function + I(a,b){Bb(a,o,b)}function + t(a,b){Bb(a,"OFFSET",b)}function + H(a,b){Ab(a,o,b)}function + D(a,b){Ab(a,"OFFSET",b)}function + Bb(a,g,f){var b=f;if(a.$FXH_PADDING_WIDTH!=undefined)b-=a.$FXH_PADDING_WIDTH;for(var d,c,e=0;e<2;e++){if(b0)b+=",";b+=c[a].offsetWidth}return b}function + _rowsHeightList(c){for(var b=Vb,a=0;a0)b+=",";b+=c[a].offsetHeight}return b}function + _trHeight(a){if(_isIE&&_IEver==8&&!_isBackCompat)return a.clientHeight;else return _offsetHeight(a)}function + _cells(e){var a=e.childNodes;if(a.length==0)return a;for(var b=[],d=0;dまたはパスワードが違います。', + LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、
生物由来データ参照は使用出来ません。', + LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、
マスタ-メンテは使用出来ません。', + LOGOUT_REASON_BACKUP_PROCESSING: 'バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテは使用できません', + LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。', + LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。', + LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。' +} + +# 新規施設担当者登録CSV(マスターメンテ) +NEW_INST_EMP_CSV_LOGICAL_NAMES = [ + '施設コード', + '施設名', + '領域コード', + 'MUID', + '担当者名(姓)', + '担当者名(名)', + 'ビジネスユニットコード', + '適用開始日', + '適用終了日' +] +# 施設コードの列No +CSV_NEW_INST_CD_COL_NO = 0 +# 施設名の列No +CSV_NEW_INST_NAME_COL_NO = 1 +# 領域コードの列No +CSV_NEW_TA_CD_COL_NO = 2 +# MUIDの列No +CSV_NEW_EMP_CD_COL_NO = 3 +# 担当者名(姓)の列No +CSV_NEW_EMP_NAME_FAMILY_COL_NO = 4 +# 担当者名(名)の列No +CSV_NEW_EMP_NAME_FIRST_COL_NO = 5 +# ビジネスユニットコードの列No +CSV_NEW_BU_CD_COL_NO = 6 +# 適用開始日の列No +CSV_NEW_START_DATE = 7 +# 適用終了日の列No +CSV_NEW_END_DATE = 8 + +# 施設担当者変更登録CSV(マスターメンテ) +CHANGE_INST_CSV_LOGICAL_NAMES = [ + 'ビジネスユニットコード', + 'ビジネスユニット名', + '組織コード', + '組織名略称', + '施設コード', + '施設名', + '領域コード', + '説明', + 'MUID', + '担当者名', + '施設担当_開始日', + '施設担当_終了日', + '終了日の変更', + 'コメント' +] +# ビジネスユニットコードの列No +CSV_CHANGE_BU_CD_COL_NO = 0 +# ビジネスユニット名の列No +CSV_CHANGE_BU_NAME_COL_NO = 1 +# 組織コードの列No +CSV_CHANGE_ORG_CD_COL_NO = 2 +# 組織名略称の列No +CSV_CHANGE_ORG_SHORT_NAME_COL_NO = 3 +# 施設コードの列No +CSV_CHANGE_INST_CD_COL_NO = 4 +# 施設名の列No +CSV_CHANGE_INST_NAME_COL_NO = 5 +# 領域コードの列No +CSV_CHANGE_TA_CD_COL_NO = 6 +# 説明の列No +CSV_CHANGE_EXPLAIN_COL_NO = 7 +# MUIDの列No +CSV_CHANGE_EMP_CD_COL_NO = 8 +# 担当者名の列No +CSV_CHANGE_EMP_FULL_NAME_COL_NO = 9 +# 施設担当_開始日の列No +CSV_CHANGE_INST_EMP_START_DATE_COL_NO = 10 +# 施設担当_終了日の列No +CSV_CHANGE_INST_EMP_END_DATE_COL_NO = 11 +# 終了日の変更の列No +CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 +# コメントの列No +CSV_CHANGE_COMMENT = 13 + +# CSVアップロードテーブル名(マスターメンテ) +CSV_REAL_TABLE_NAME = '本番テーブル' +CSV_CHANGE_TABLE_NAME = 'ダミーテーブル' + +MENTE_CSV_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data') + +MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS = [ + 'inst_cd', + 'inst_name', + 'ta_cd', + 'emp_cd', + 'emp_name_full', + 'bu_cd', + 'bu_name', + 'start_date', + 'end_date', + 'creater', + 'create_date', + 'updater', + 'update_date' +] + +MENTE_CSV_DOWNLOAD_HEADER = [ + '施設コード', + '施設名', + '領域コード', + 'MUID', + '担当者名', + 'ビジネスユニットコード', + 'ビジネスユニット名', + '適用開始日', + '適用終了日', + '作成者', + '作成日', + '更新者', + '更新日' +] + +MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv' + +# CSVアップロードの制限サイズ=20MB +MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE = 20971520 + +# 利用停止区分 +DISPLAY_USER_STOP_DIV = { + '01': '全面的に利用停止', + '03': '特定の項目について利用停止', + '04': '全てのDM等利用停止' +} + +DISPLAY_USER_STOP_DIV_SHORT = { + '01': '全面停止', + '03': '特定項目停止', + '04': '全DM停止' +} diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py new file mode 100644 index 00000000..a03b02d5 --- /dev/null +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -0,0 +1,27 @@ +import os + +COGNITO_AUTH_DOMAIN = os.environ['COGNITO_AUTH_DOMAIN'] +AUTHORIZE_ENDPOINT = os.environ['AUTHORIZE_ENDPOINT'] +TOKEN_ENDPOINT = os.environ['TOKEN_ENDPOINT'] +COGNITO_IDENTITY_PROVIDER = os.environ['COGNITO_IDENTITY_PROVIDER'] +COGNITO_REDIRECT_URI = os.environ['COGNITO_REDIRECT_URI'] +COGNITO_USER_POOL_ID = os.environ['COGNITO_USER_POOL_ID'] +COGNITO_CLIENT_ID = os.environ['COGNITO_CLIENT_ID'] +COGNITO_CLIENT_SECRET = os.environ['COGNITO_CLIENT_SECRET'] +AWS_REGION = os.environ['AWS_REGION'] +SESSION_TABLE_NAME = os.environ['SESSION_TABLE_NAME'] +BIO_ACCESS_LOG_BUCKET = os.environ['BIO_ACCESS_LOG_BUCKET'] +MASTER_MAINTENANCE_BUCKET = os.environ['MASTER_MAINTENANCE_BUCKET'] + +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'] + +BIO_SEARCH_RESULT_MAX_COUNT = int(os.environ.get('BIO_SEARCH_RESULT_MAX_COUNT', 35000)) +BIO_EXCEL_RESULT_MAX_COUNT = int(os.environ.get('BIO_EXCEL_RESULT_MAX_COUNT', 15000)) +ULTMARC_SEARCH_RESULT_MAX_COUNT = int(os.environ.get('ULTMARC_SEARCH_RESULT_MAX_COUNT', 500)) +SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE']) + +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-webapp/src/templates/__init__.py b/ecs/jskult-webapp/src/templates/__init__.py new file mode 100644 index 00000000..d3c1713f --- /dev/null +++ b/ecs/jskult-webapp/src/templates/__init__.py @@ -0,0 +1,6 @@ +import os + +from fastapi.templating import Jinja2Templates + +templates_path = os.path.dirname(os.path.relpath(__file__)) +templates = Jinja2Templates(templates_path) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html new file mode 100644 index 00000000..95ac2464 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -0,0 +1,19 @@ + + + + + +{{subtitle}} + + + + + + + + + + + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/_loading.html b/ecs/jskult-webapp/src/templates/_loading.html new file mode 100644 index 00000000..437c7e50 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/_loading.html @@ -0,0 +1,5 @@ +
+
+ {{progress_message}} +
+
diff --git a/ecs/jskult-webapp/src/templates/_modal.html b/ecs/jskult-webapp/src/templates/_modal.html new file mode 100644 index 00000000..31d7df97 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/_modal.html @@ -0,0 +1,44 @@ +{% with + icon_data = { + 'info': { + 'alert': 'alert-primary', + 'icon_src': '/static/img/icon_modal_confirm.png' + }, + 'warning': { + 'alert': 'alert-warning', + 'icon_src': '/static/img/icon_modal_error.png' + } + } +%} + +{% endwith %} diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html new file mode 100644 index 00000000..1e345ccc --- /dev/null +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -0,0 +1,576 @@ + + + + {% with subtitle = bio.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + +
+ + + + + +

{{bio.subtitle}}

+ +
+ + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
データ種別伝票管理NO処理日卸コード卸サブコード卸名卸組織コード伝票番号発伝年月日卸取引区分取引区分名製品コード統一商品コード商品名卸報告商品名納入先コード納入先名卸報告納入先名納入先住所卸報告納入先住所ロット番号数量有効期限データ区分エラー詳細種別訂正前伝票管理NO修正者修正日時施設コード施設名施設住所施設電話番号Veeva卸コードVeeva卸組織コード卸組織名Veeva取引区分コード2017年11月以前データ
+
+
+
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+ + + + + {% with + modal_id='modal_xlsx', + modal_title='確認', + message='生物由来卸販売データ一覧をExcel出力しますか?
※出力件数が' + bio.excel_max_lines + '件に制限されます。全件出力したい場合はCSVで出力してください。', + icon_key='info', + modal_close_event='', + buttons = [ + { + 'id': 'excel_confirm_ok', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'download("xlsx")' + }, + { + 'id': 'excel_confirm_cancel', + 'class': 'btn btn-secondary', + 'dismiss': 'modal', + 'text': 'Cancel', + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + {% with + modal_id='modal_csv', + modal_title='確認', + message='生物由来卸販売データ一覧をCSV出力しますか?', + icon_key='info', + modal_close_event='', + buttons = [ + { + 'id': 'csv_confirm_ok', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'download("csv")' + }, + { + 'id': 'csv_confirm_cancel', + 'class': 'btn btn-secondary', + 'dismiss': 'modal', + 'text': 'Cancel', + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + {% with + modal_id='ErrorModal_DB', + modal_title='エラー', + message='DB接続に失敗しました。しばらく経ってから再度実行してください。', + icon_key='warning', + modal_close_event='', + buttons = [ + { + 'id': 'error_modal_db', + 'class': 'btn btn-primary', + 'dismiss': 'modal', + 'text': 'OK' + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + + {% with + modal_id='ErrorModal_Unexpected', + modal_title='エラー', + message='サーバーからの応答がありません。しばらく経ってから再度実行してください。', + icon_key='warning', + modal_close_event='', + buttons = [ + { + 'id': 'error_modal_unexpected', + 'class': 'btn btn-primary', + 'text': 'OK', + 'dismiss': 'modal' + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + + + {% with progress_message = '出力中...'%} + {% include '_loading.html' %} + {% endwith %} + + {% with progress_message = '', id = '_loading_for_other' %} + {% include '_loading.html' %} + {% endwith %} + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html new file mode 100644 index 00000000..1e2f086c --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -0,0 +1,237 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + 医師情報 + + + + + + + + + + + +

{{ultmarc.subtitle}}

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ + + + + + + + + + + + + + + + +
+ + + {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード:氏名(漢字):氏名(カナ):
性別:生年月日:利用停止区分:
+ 出身大学: + + 出身県: + + 卒年: + + 登録年: + + 開業年: + +
+ 診療科目: + {% for trt_coursed_data in ultmarc.trt_coursed_data %} + + {% endfor %} + {% for i in range(5-ultmarc.is_input_trt_course_data_size())%} + + {% endfor %} +
+ + + + + + + + +
+

所属学会

+
+ + + + + + + + + {% for sosiety_data in ultmarc.sosiety_data %} + + + + + {% endfor %} + +
コード所属学会
{{sosiety_data.sosiety_cd or ' '}}{{sosiety_data.sosiety_name or ' '}}
+
+
+

所属学会専門医

+
+ + + + + + + + + {% for specialist_license_data in ultmarc.specialist_license_data %} + + + + + {% endfor %} + +
コード専門医資格名
{{specialist_license_data.specialist_cd or ' '}}{{specialist_license_data.specialist_license_name or ' '}}
+
+
+ +

勤務先履歴

+
+ + + + + + + + + + + + + + + + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} + {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} + + + + + + + + + + + {% endif %} + {% endfor %} + {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} + {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} + + + + + + + + + + + {% endif %} + {% endfor %} + +
ULT施設コード勤務先略名所属部科名役職名職位開始年月日終了年月日DM不可
+ {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_data.inst_name_kanji or ''}}{{doctor_wrkplace_data.blng_sec_name or ''}}{{doctor_wrkplace_data.univ_post_name or ''}}{{doctor_wrkplace_data.post_name or ''}}{{ultmarc.is_input_aply_start_ymd_format(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99{{ultmarc.is_input_notdm_flg_name(doctor_wrkplace_data.notdm_flg)}}
+ {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_his_data.inst_name_kanji or ''}}{{doctor_wrkplace_his_data.blng_sec_name or ''}}{{doctor_wrkplace_his_data.univ_post_name or ''}}{{doctor_wrkplace_his_data.post_name or ''}}{{ultmarc.is_input_his_aply_start_ymd_format(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_his_aply_end_ymd_format(doctor_wrkplace_his_data.aply_end_ymd)}}{{ultmarc.is_input_notdm_flg_name(doctor_wrkplace_his_data.notdm_flg)}}
+
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html new file mode 100644 index 00000000..5698807f --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -0,0 +1,312 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + + + + + +

{{ultmarc.subtitle}}

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
医師コード氏名勤務先名所属部科診療科目役職名出身大学卒年利用停止区分
+ {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} +
+ 検索件数が500件を超えています 検索項目を見直してください +
+ {% endif %} + {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} +
+ 対象のデータが存在しません。 +
+ {% endif %} + +
+ + +
+ + + +{% with progress_message = ''%} +{% include '_loading.html' %} +{% endwith %} + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html new file mode 100644 index 00000000..93ecf332 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -0,0 +1,192 @@ + + + + {% with subtitle = mainte_csv_dl.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + +

+ + + + + +

施設担当者データCSVダウンロード

+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
領域コード: + + 施設コード: + + MUID: + +
適用期間内: + + 適用開始日: + + ~ + + 適用終了日: + + ~ + +
対象テーブル: + + + データ作成日: + + ~ + + データ更新日: + + ~ + +
+ + +
+
+

+ {% if mainte_csv_dl.is_search %} + {% if mainte_csv_dl.data_count == 0 %} +

{{mainte_csv_dl.result_msg}}
+ {% else %} +
{{mainte_csv_dl.result_msg}}
+ {% endif %} + {% endif %} +

+ + {% with progress_message = '処理中...しばらくお待ち下さい。'%} + {% include '_loading.html' %} + {% endwith %} + + {% with progress_message = '', id = '_loading_for_back' %} + {% include '_loading.html' %} + {% endwith %} + + diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html new file mode 100644 index 00000000..bf1bf845 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -0,0 +1,213 @@ + + + + {% with subtitle = mainte_csv_up.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + +

+ + + + + +

施設担当者データCSVアップロード

+ {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} + + {% else %} + + {% endif %} +
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
機能: + + + +
登録テーブル: + + + +
登録CSV: + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} + {{mainte_csv_up.csv_file_name}} + {% else %} + + {% endif %} + + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() and mainte_csv_up.select_table == 'real' %} + +
本番テーブルが選択されています
+ {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() and mainte_csv_up.select_table == 'dummy' %} + + + {% else %} + + + {% endif %} +
+{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} + + + +{% endif %} +
+

+ + {% if not mainte_csv_up.is_error_message_list_empty() %} +

+ {% for error_message in mainte_csv_up.error_message_list %} + {{error_message}}
+ {% endfor %} +
+ {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} +
+
件数:{{mainte_csv_up.csv_data_count()}}件
+ + + + + {% for column_name in mainte_csv_up.upload_data_columns() %} + + {% endfor %} + + {% for item in mainte_csv_up.csv_upload_list %} + + {% for key, value in item.items() %} + + {% endfor %} + + {% endfor %} + +
{{column_name}}
{{value}}
+
+ {% elif mainte_csv_up.is_insert %} +
+ {% for message in mainte_csv_up.result_message_list %} + {{ message }}
+ {% endfor %} +
+ {% endif %} +

+ + + {% with progress_message = '処理中...しばらくお待ち下さい。'%} + {% include '_loading.html' %} + {% endwith %} + + {% with progress_message = '', id = '_loading_for_back' %} + {% include '_loading.html' %} + {% endwith %} + + diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html new file mode 100644 index 00000000..839f6769 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -0,0 +1,292 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + +

+ {{ultmarc.subtitle}} +

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
施設コード + + 未確認 + 施設コード変換先 + + 休院店開始年月 + + 休院店 +
削除予定理由 + + 削除日 + + 開業予定年月 + + 開業 +
正式施設名(カナ)
正式施設名(漢字)
略式施設名(カナ)施設区分名
略式施設名(漢字)経営体 + + +
郵便番号 + + 住所不明 + 施設電話番号 + + 電話なし +
住所(カナ)
住所(漢字)
+ +
+ + + + + + + + + + + + + + + + + + + + +
病院種別再審査区分関連大学親名 + + +
診療科目 + {% if ultmarc.inst_trt_coursed_data != None %} + {% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %} + + {% endfor %} + {% endif %} + {% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %} + + {% endfor %} + +
検査工程 + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
特務医務室許可病床数 + + + + + + + + + + + + + + + + + + + + + +
一般療養精神感染症結核その他合計
+
病棟閉鎖  一部病棟閉鎖
病床数(定員)メンテ年月日
+ + + + + + + + + + + + + + + + + + + + +
代表者個人コード
施設代表者(カナ)
施設代表者(漢字)
修正年月日
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html new file mode 100644 index 00000000..92f08e10 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -0,0 +1,297 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + + + + + + +

{{ultmarc.subtitle}}

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + +
ULT施設コード削除ULT施設名(漢字)ULT施設住所(漢字)郵便番号施設電話番号施設区分名病院種別都道府県
+ {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} +
+ 検索件数が500件を超えています 検索項目を見直してください +
+ {% endif %} + {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} +
+ 対象のデータが存在しません +
+ {% endif %} +
+ + + +
+ + + + +{% with progress_message = ''%} +{% include '_loading.html' %} +{% endwith %} + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/logout.html b/ecs/jskult-webapp/src/templates/logout.html new file mode 100644 index 00000000..cc79a4ac --- /dev/null +++ b/ecs/jskult-webapp/src/templates/logout.html @@ -0,0 +1,22 @@ + + + + {% with subtitle = logout.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + +
+

MeDaCA

+

+

+ {% autoescape False %} + {{logout.reason}} + {% endautoescape %} +

+


+

{{logout.link_text}}

+
+ + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/maintlogin.html b/ecs/jskult-webapp/src/templates/maintlogin.html new file mode 100644 index 00000000..6a3a7d71 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/maintlogin.html @@ -0,0 +1,29 @@ + + + + {% with subtitle = mainte_login.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + +
+

+ MeDaCA
+ Mainte Login +

+

+
+
+ + +
+ +
+
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html new file mode 100644 index 00000000..fe0f7a93 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -0,0 +1,26 @@ + + + + {% with subtitle = menu.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} + + diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html new file mode 100644 index 00000000..8b920198 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -0,0 +1,42 @@ + + + + {% with subtitle = menu.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + +
+

MeDaCA
機能メニュー

+

+ {% if menu.is_available_ult_doctor_menu() %} + Ultmarc照会(医師)

+ {% endif %} + {% if menu.is_available_ult_inst_menu() %} + Ultmarc照会(施設)

+ {% endif %} + {% if menu.is_available_bio_menu() %} + {% if not menu.is_batch_processing() %} + 生物由来データ参照

+ {% else %} +
生物由来データ参照は
日次バッチ処理中のため利用出来ません
+ {% endif %} + {% endif %} + {% if menu.is_available_master_maintenance_menu() %} + {% if menu.is_batch_processing() %} +
マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ {% elif menu.is_backup_processing() %} +
バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテメニューは利用できません
+ {% else %} + マスターメンテメニュー

+ {% endif %} + {% endif %} +

Logout +
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} + + diff --git a/ecs/jskult-webapp/src/templates/sample_send_file.html b/ecs/jskult-webapp/src/templates/sample_send_file.html new file mode 100644 index 00000000..58926e59 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/sample_send_file.html @@ -0,0 +1,26 @@ + + + + {% with subtitle = 'サンプルファイル送信' %} + {% include '_header.html' %} + {% endwith %} + + + +
+

サンプルファイル送信

+

+
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html new file mode 100644 index 00000000..b5fe6a58 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -0,0 +1,65 @@ + + + + {% with subtitle = table_override.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + +

+ + + + + +

テーブル上書きコピー

+

+ + + + + + + + + +
+ +
+
+ +
+
+ {% if table_override.is_override %} +

+

ダミー従業員担当施設マスタのデータを本番従業員担当施設マスタのデータで上書きしました
+

+ {% endif %} + + {% with progress_message = 'データ上書き中...しばらくお待ち下さい。'%} + {% include '_loading.html' %} + {% endwith %} + + {% with progress_message = '', id = '_loading_for_back' %} + {% include '_loading.html' %} + {% endwith %} + + diff --git a/ecs/jskult-webapp/src/util/sanitize.py b/ecs/jskult-webapp/src/util/sanitize.py new file mode 100644 index 00000000..3e052717 --- /dev/null +++ b/ecs/jskult-webapp/src/util/sanitize.py @@ -0,0 +1,21 @@ +"""サニタイズ処理用デコレーター""" + +import html + + +def sanitize(cls): + original_init = cls.__init__ + + def new_init(self, *args, **kwargs): + # オリジナルの __init__ メソッドを呼び出してインスタンスを初期化 + sanitized_kwargs = {**kwargs} + for key, value in kwargs.items(): + if isinstance(value, str): + # 文字列の場合はサニタイズ処理を行う(例:HTMLタグをエスケープ) + sanitized_value = html.escape(value, quote=True) + sanitized_kwargs[key] = sanitized_value + original_init(self, *args, **sanitized_kwargs) + + cls.__init__ = new_init + + return cls diff --git a/ecs/jskult-webapp/src/util/string_util.py b/ecs/jskult-webapp/src/util/string_util.py new file mode 100644 index 00000000..f7e0cad7 --- /dev/null +++ b/ecs/jskult-webapp/src/util/string_util.py @@ -0,0 +1,10 @@ +def is_not_empty(check_string: str) -> bool: + """文字列が空ではない場合True + + Args: + check_string (str): 検査する文字列 + + Returns: + bool: 文字列が殻ではない場合、True + """ + return check_string is not None and len(check_string) > 0 diff --git a/ecs/restore-dbdump/.dockerignore b/ecs/restore-dbdump/.dockerignore new file mode 100644 index 00000000..d826198a --- /dev/null +++ b/ecs/restore-dbdump/.dockerignore @@ -0,0 +1,13 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql +*.gz diff --git a/ecs/restore-dbdump/.env.example b/ecs/restore-dbdump/.env.example new file mode 100644 index 00000000..1a407863 --- /dev/null +++ b/ecs/restore-dbdump/.env.example @@ -0,0 +1,7 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 +DUMP_FILE_S3_PATH=******************* +LOG_LEVEL=INFO \ No newline at end of file diff --git a/ecs/restore-dbdump/.gitignore b/ecs/restore-dbdump/.gitignore new file mode 100644 index 00000000..339d80cc --- /dev/null +++ b/ecs/restore-dbdump/.gitignore @@ -0,0 +1,16 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ + +# mysql config file +my.cnf + +# compress file +*.gz \ No newline at end of file diff --git a/ecs/restore-dbdump/.vscode/launch.json b/ecs/restore-dbdump/.vscode/launch.json new file mode 100644 index 00000000..23c4b05f --- /dev/null +++ b/ecs/restore-dbdump/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)restore dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/restore-dbdump/.vscode/recommended_settings.json b/ecs/restore-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/restore-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/restore-dbdump/Dockerfile b/ecs/restore-dbdump/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/restore-dbdump/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/restore-dbdump/Pipfile b/ecs/restore-dbdump/Pipfile new file mode 100644 index 00000000..f032c7ea --- /dev/null +++ b/ecs/restore-dbdump/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/restore-dbdump/Pipfile.lock b/ecs/restore-dbdump/Pipfile.lock new file mode 100644 index 00000000..58c4d231 --- /dev/null +++ b/ecs/restore-dbdump/Pipfile.lock @@ -0,0 +1,71 @@ +{ + "_meta": { + "hash": { + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/restore-dbdump/README.md b/ecs/restore-dbdump/README.md new file mode 100644 index 00000000..187692af --- /dev/null +++ b/ecs/restore-dbdump/README.md @@ -0,0 +1,67 @@ +# ダンプ復元スクリプト + +## 概要 + +当処理は特定の機能で利用するものではなく、共通処理として要件に応じて実行することを想定している。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - 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 コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/restore_backup.py」で行っている。 + +## フォルダ構成 + +```txt +. +├── .env.example -- ローカル実行用の環境変数のサンプル値。 +├── .dockerignore -- docker build時のコンテキストに含めるファイルの抑制リスト +├── .gitignore -- Git差分管理除外リスト +├── Dockerfile -- Dockerイメージ作成用 +├── Pipfile -- pythonの依存関係管理 +├── Pipfile.lock -- 依存関係バージョン固定 +├── README.md -- 当ファイル +├── entrypoint.py -- エントリーポイントとなるファイル +├── mysql_dpkg_selection.txt -- Dockerイメージでdpkgを使うときに外部から注入する選択値 +└── src -- ソースコードフォルダ + ├── logging + │ └── get_logger.py -- ロガー + ├── restore_backup.py -- dump復元処理本体 + └── system_var + ├── constants.py -- 定数ファイル + └── environment.py -- 環境変数ファイル +``` diff --git a/ecs/restore-dbdump/entrypoint.py b/ecs/restore-dbdump/entrypoint.py new file mode 100644 index 00000000..70f48060 --- /dev/null +++ b/ecs/restore-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク DBダンプ復元のエントリーポイント""" +from src import restore_backup + +if __name__ == '__main__': + try: + exit(restore_backup.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/restore-dbdump/mysql_dpkg_selection.txt b/ecs/restore-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/restore-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/restore-dbdump/src/__init__.py b/ecs/restore-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/restore-dbdump/src/logging/get_logger.py b/ecs/restore-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/restore-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +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): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/restore-dbdump/src/restore_backup.py b/ecs/restore-dbdump/src/restore_backup.py new file mode 100644 index 00000000..39b92f23 --- /dev/null +++ b/ecs/restore-dbdump/src/restore_backup.py @@ -0,0 +1,108 @@ +"""ダンプ復元スクリプト""" + +import os +import subprocess +import textwrap + +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('ダンプ復元スクリプト') + + +def exec(): + try: + logger.info('ダンプ復元スクリプト:開始') + + # 事前処理(共通処理としては空振りする) + _pre_exec() + + # メイン処理 + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + os.chmod(my_cnf_path, 0o444) + + # DBへの接続エラーを早期に検出するため、事前にMySQLサーバーに接続 + mysql_pre_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", + environment.DB_SCHEMA, '-N', '-e', 'SELECT 1;'], + stderr=subprocess.PIPE + ) + + _, error = mysql_pre_process.communicate() + if mysql_pre_process.returncode != 0: + logger.error( + f'MySQLサーバーへの接続に失敗しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 復元対象のダンプファイルを特定 + s3_file_path = environment.DUMP_FILE_S3_PATH + + # aws s3 cpコマンドを実行してdumpファイルをローカルにダウンロードする + s3_cp_process = subprocess.Popen( + ['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + logger.error( + f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + # S3コマンドの標準エラーはクローズしておく + s3_cp_process.stderr.close() + + # gzipコマンドを実行してdumpファイルを解凍する + gzip_process = subprocess.Popen( + ['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # mysqlコマンドを実行し、dumpを復元する + mysql_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', + f"{environment.DB_PORT}", environment.DB_SCHEMA], + stdin=gzip_process.stdout, stderr=subprocess.PIPE + ) + # gzipの標準出力をmysqlに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + _, error = mysql_process.communicate() + if mysql_process.returncode != 0: + logger.error( + f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 事後処理(共通処理としては空振りする) + _post_exec() + + logger.info('[NOTICE]ダンプ復元スクリプト:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'ダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + +def _pre_exec(): + """ + ダンプ復元 事前処理 + 共通機能としては事前処理を実装しない。 + 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass + + +def _post_exec(): + """ + ダンプ復元 事後処理 + 共通機能としては事後処理を実装しない。 + 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass diff --git a/ecs/restore-dbdump/src/system_var/__init__.py b/ecs/restore-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/restore-dbdump/src/system_var/constants.py b/ecs/restore-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..8a555af3 --- /dev/null +++ b/ecs/restore-dbdump/src/system_var/constants.py @@ -0,0 +1,2 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 diff --git a/ecs/restore-dbdump/src/system_var/environment.py b/ecs/restore-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..bddc0a38 --- /dev/null +++ b/ecs/restore-dbdump/src/system_var/environment.py @@ -0,0 +1,12 @@ +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'] + +# AWS +DUMP_FILE_S3_PATH = os.environ['DUMP_FILE_S3_PATH'] +LOG_LEVEL = os.environ['LOG_LEVEL'] diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index bb85058b..8f7fdc66 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -18,142 +18,147 @@ "default": { "awslambdaric": { "hashes": [ - "sha256:059c7a66d4470169e01620d93f07424b80d302e3736cd11e68373f293a41e396", - "sha256:0e90053614f0e5e5d6d6ae6d164412ce95b5d549c6fb0f6ff4290d77c5e9d3e5", - "sha256:11a365164efec105aa670259dfe473d9609da8f6f2e468790b2dfc24969bfff1", - "sha256:19da28e8c892b1c52a9db4d2b986af303932e3a4c4632eb0c5d5eb6a673c6022", - "sha256:2eb2fdb1ae0f84669d37f193f247fa115a282a7777e051ced3a33620d6280646", - "sha256:2efff2292fc8f8484eb094ffd77808a67815353be898a7f0b33ce51b841af691", - "sha256:387b94cb0358662ae2b203f0aa2af25e80c6a2019a6b569f733ecd993a4f53d2", - "sha256:38f8ae67ecb5b4e9f7fc42746ee39765dd7ddab359cb7e8ebfda1de0f0c0b059", - "sha256:3fd0e1b3891987fa7ebb0c08d24c76af5fc17466f6efdfa9a59848dfb23930ec", - "sha256:63a82d21d66146b3fde7eb6086abd058b75bdcab4a02b02afe0e8e4a45edfb5b", - "sha256:676a741ad8f3aa27d651bcf3a2b83d5cee815f99c8b2b9abef3cb22ca7b29698", - "sha256:9b0781bd41c20a2f2a0b018464a1daa376f663bd5eb7b0b6ba78f483681b1519", - "sha256:bad98f2f94cecc90b89ac4e1d4feed96eb664e13c29b7ce232444cc9358e0d36", - "sha256:d64dcba8da9dbea62644133a48c75376a37bfe0f84096ad73bf7fc5b2eb31fc7", - "sha256:d8f280b25d8a7ae6b6ff92a9bbc6567b984264be8ef3e0fcb0402a1247f6c75d", - "sha256:dad646f566aa7ec9b7179f16ca6741a2bea148abec6ed5947f86d00607e0a9a2", - "sha256:dc7072f642fdd215387d4921bbd5ac91b96a4a705bce5e7853622d09fe59f57d", - "sha256:fbbd24446ce2f876335b178f04aa4ec7ec480afc0f9621ebfdd5f55ad4b7c06e", - "sha256:fe76893a1b42bcee4c91c6456092d2a42455818756e8f62d50e8c5adb22fa9e7" + "sha256:038aa61eb897e94a198a1c27213b79848509f43df622238ab2271a20f11d5d39", + "sha256:05070850dad5af71c911a04ccb6c376dbdb7aed6aaba2fb1d09eaff6ebb26b0d", + "sha256:09acc9715f74c994e8688436e4d3c496148fc945c4fe1a28ef1e3b9529453133", + "sha256:173baa4d61cf648d0e580e6e8ebebb212e50e0e0366352ba20daaef63761c9ed", + "sha256:238cdff033edf6182024305224da1bbdb8bfef1207b04e35816a5d5e5516344a", + "sha256:2bb5027d7f2c4f480b039f73a015d41c046037ab341dc1dbb55d8494133304a6", + "sha256:2cb6fa2ad9a34ff9d0a678034fefce286de83f9a55b792af60e79e3ba1d3d71f", + "sha256:2d12e7f096d6bee43e731b75184abdf10f22765824387f6ae3429a480e696b2b", + "sha256:39e8e4579e913a76b580bd22b36af8d808c7b4bb8bf5a2b526f0149edd029e4f", + "sha256:3c3f339f89c6318fe56c1b6d8ef74aadaf486f56746dd1e04f73f83881d32ae5", + "sha256:42c18fccc0079c96a9bdfd219e7d1e736c41b8a44319de3a75ff960523f24696", + "sha256:4465a604de74ffd202d4b891c88228fdfac39a306725fee593c76b4377d847c5", + "sha256:50531d37c4a1737fe3c6540cf0852459cecd4e7a03e4c2791a24bc32db153235", + "sha256:5414c81e6cf088be51a0024e2202e0faf2e9dba2cc247a55e59f4ffc34369bfb", + "sha256:5a11cd06dc29459bf3b9da570af612fcf4dca1060bcfd2b78c36c835a37ae5c1", + "sha256:5eeb3b5294b220d133b569f096ac922e6665811aefefe8e7e4b5d907b1a1bf2b", + "sha256:665b1849fe46e25589835219dc226f77c13fff6c27fc2f34e9e49cb03cf5019a", + "sha256:6afbd60e3a78945bcee586eca4924df4aa3c552065b91a85711cc6771e65a138", + "sha256:6f3ad30165498d4748fffab87b32897fd7f15f67fed7804bfba4ed96a4babf14", + "sha256:9b97da2fe64fb016fa81a88205f8f5e5a9c4a43344c9771b13d94467fdf85b4e", + "sha256:a5e9dce5b5b1ccb809d4386b24f7ea971c8abfd84037f43148db06ecf271c4c5", + "sha256:b62eda8e3a034c692a7b2e589e77bc1d3130121dca2ebb9efea9ce31c14079f6", + "sha256:e6cdab6054fff4fd16c4a3a33a9c4e5aa18ac39f215d0e3a3345d3036cdc418a" ], "index": "pypi", - "version": "==2.0.4" + "markers": "python_version >= '3.6'", + "version": "==2.0.10" }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.26.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], - "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "version": "==1.15.1" + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.16.0" }, "cryptography": { "hashes": [ - "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b", - "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f", - "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190", - "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f", - "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f", - "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb", - "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c", - "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773", - "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72", - "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8", - "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717", - "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9", - "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856", - "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96", - "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288", - "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39", - "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e", - "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce", - "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1", - "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de", - "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df", - "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf", - "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], "index": "pypi", - "version": "==39.0.0" + "markers": "python_version >= '3.7'", + "version": "==42.0.5" }, "jmespath": { "hashes": [ @@ -172,27 +177,28 @@ }, "pymysql": { "hashes": [ - "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641", - "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", - "version": "==1.0.2" + "markers": "python_version >= '3.7'", + "version": "==1.1.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "s3transfer": { "hashes": [ - "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd", - "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.6.0" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "simplejson": { "hashes": [ @@ -255,29 +261,31 @@ }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version < '3.10'", + "version": "==1.26.18" } }, "develop": { "autopep8": { "hashes": [ - "sha256:be5bc98c33515b67475420b7b1feafc8d32c1a69862498eda4983b45bffd2687", - "sha256:d27a8929d8dcd21c0f4b3859d2d07c6c25273727b98afc984c039df0f0d86566" + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", - "version": "==2.0.1" + "markers": "python_version >= '3.6'", + "version": "==2.0.4" }, "flake8": { "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.0.0" + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -289,19 +297,19 @@ }, "pycodestyle": { "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.1" }, "pyflakes": { "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_version >= '3.8'", + "version": "==3.2.0" }, "tomli": { "hashes": [ diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py new file mode 100644 index 00000000..389c82f9 --- /dev/null +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -0,0 +1,375 @@ +import csv +import datetime +import io +import json +import logging +import os +import re +from zoneinfo import ZoneInfo + +import boto3 +from dateutil.relativedelta import relativedelta + +# 環境変数 +CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] +CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH = os.environ["CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH"] +CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] +MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] +MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] +PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] +PROCESSED_MESSAGE_EXPIRES_PERIOD = int( + os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"]) +LOG_LEVEL = os.environ["LOG_LEVEL"] +TZ = os.environ["TZ"] + +# 定数 +ROW_COMMENT_SYMBOL = '#' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 +INDEX_ROW_COMMENT_SYMBOL = 0 +INDEX_SPLIT_NUM = 1 +INDEX_LAST = -1 + +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' + +# AWS操作クライアント +s3_client = boto3.client('s3') +sns_client = boto3.client('sns') +dynamodb_client = boto3.client('dynamodb') + + +# logger設定 +def log_datetime_convert_tz(*arg): + """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" + return datetime.datetime.now(ZoneInfo(TZ)).timetuple() + + +logger = logging.getLogger() +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +formatter.converter = log_datetime_convert_tz +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def is_duplicate_message(message_id: str) -> bool: + """DynamoDBテーブルに処理済みのSQSメッセージIdが存在するかどうかを調査する + + Args: + message_id (str): SQSメッセージId + + Returns: + bool: 存在する場合はTrue + """ + return dynamodb_client.query( + TableName=PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME, + Select='COUNT', + KeyConditionExpression='message_id = :message_id', + ExpressionAttributeValues={ + ':message_id': {'S': message_id} + } + )["Count"] != 0 + + +def put_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: + """処理済みのSQSメッセージIdをDynamoDBにPushする + + Args: + batch_item_success (list[str]): SQSメッセージIdのリスト + + Returns: + bool: 登録成功の場合、True + """ + + # レコードの有効期限を算出 + now = datetime.datetime.now(ZoneInfo(TZ)) + record_expiration_datetime = now + \ + datetime.timedelta(minutes=PROCESSED_MESSAGE_EXPIRES_PERIOD) + record_expiration_time = record_expiration_datetime.timestamp() + + for message_id in batch_item_success: + dynamodb_client.put_item( + TableName=PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME, + Item={ + 'message_id': {'S': message_id}, + 'record_expiration_time': {'N': f'{record_expiration_time}'} + } + ) + return True + + +def substitute_mail_template(mail_template: str, receive_timing: str, mail_msg: str) -> str: + """メールテンプレートのプレースホルダーを置き換える + + Args: + mail_template (str): 置き換え前のメールテンプレート + receive_timing (str): メールテンプレートのプレースホルダーを置き換える文言(受信タイミング) + mail_msg (str): メールテンプレートのプレースホルダーを置き換える文言(ファイル一覧) + + Returns: + str: 置き換え後のメール本文 + """ + substitute_dict = { + "receive_timing": receive_timing, + "notice_file_names": mail_msg + } + mail_str = mail_template.format_map(substitute_dict) + return mail_str + + +def make_failure_item_on_error(message_id: str) -> dict[str, str]: + """Report batch item failuresによる処理に失敗したメッセージの判別のためのレスポンスを作成する + @see + Args: + message_id (str): SQSメッセージId + + Returns: + dict[str, str]: Report batch item failuresで失敗したSQSメッセージを判別するための辞書オブジェクト + """ + return {"itemIdentifier": message_id} + + +def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, str]], list[str]]: + """Enciseデータ未受領チェック + + Args: + records (list): SQS Eventのレコードリスト + execute_month (str): 処理起動年月 + + Returns: + tuple[list[dict[str, str]], list[str]]: 失敗メッセージIdのリスト, 成功メッセージIdのリスト + """ + batch_item_failures = [] + batch_item_success = [] + + for record in records: + # メール挿入用文言を格納するためのメモリを保持する + mail_message = '' + try: + try: + # 1.SQSメッセージIDを取得する + message_id = record["messageId"] + # 2.DynamoDBテーブルからレコードを取得し、処理済みメッセージかどうかを判別する + if is_duplicate_message(message_id): + logger.info( + f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') + continue + except Exception as e: + logger.exception(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") + batch_item_failures.append( + make_failure_item_on_error(message_id)) + continue + + # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 + event_parameter = json.loads(record['body']) + + # ③ 設定ファイル[受領チェック対象ファイルリスト]を読み込む + try: + logger.info( + 'I-03-01 ' + + '受領チェック対象ファイルリスト読込 読込元:' + + f'{CONFIG_BUCKET_NAME}/{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + check_target_file_list_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') + except Exception as e: + logger.exception( + f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") + batch_item_failures.append( + make_failure_item_on_error(message_id)) + continue + + # ④ 受領チェック処理を行う + receive_timing = event_parameter['receive_timing'] + logger.info(f'I-04-01 Enciseデータ受領チェック ({receive_timing}) 処理開始') + object_prefix = f'{event_parameter["check_folder_prefix"]}/{execute_month}/' + # 1.Enciseデータバックアップ保管バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する + logger.info( + f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{object_prefix}' + ) + receive_file_list_response = s3_client.list_objects_v2( + Bucket=CHECK_BUCKET_NAME, Prefix=object_prefix) + receive_file_list = [] + for content in receive_file_list_response.get('Contents', []): + # オブジェクトのキーからファイル名を切り出してリストに追加 + obj_key = content['Key'].rsplit('/', INDEX_SPLIT_NUM) + receive_file_list.append(obj_key[INDEX_LAST]) + + # 2.I/Fファイルチェック処理 + logger.info(f'I-04-03 Enciseデータ({receive_timing}) ファイルチェック処理開始') + check_target_file_name_body = io.TextIOWrapper(io.BytesIO( + check_target_file_list_response["Body"].read()), encoding='utf-8') + match_count = 0 + row_count = 0 + for tsv_row in csv.reader(check_target_file_name_body, delimiter='\t'): + # 「④1.」で取得したリストが「③」で読み込んだファイル内に存在するか確認する + is_file_not_exists = True + for file_name in receive_file_list: + match_result = re.fullmatch( + tsv_row[INDEX_REGEX], file_name) + # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 + if match_result is not None: + is_file_not_exists = False + # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 + match_group_yyyymm = match_result.group(1) + today = datetime.datetime.now(ZoneInfo(TZ)) + minus_1_month = today + relativedelta(months=-1) + check_target_yyyymm = minus_1_month.strftime('%Y%m') + if match_group_yyyymm == check_target_yyyymm: + logger.info( + f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') + match_count += 1 + else: + logger.info( + f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}(受領年月が不正:{file_name})\n' + break + if is_file_not_exists: + logger.info( + f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' + + row_count += 1 + + if row_count == match_count: + logger.info('I-04-05 I/Fファイルは全て受領していることを確認しました') + + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + logger.info('I-05-01 メール送信処理開始') + + if len(mail_message) == 0: + logger.info( + f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') + batch_item_success.append(message_id) + continue + + # 1.存在した場合 + logger.info( + f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') + + try: + logger.info( + 'I-05-03 ' + + f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_template = ( + mail_title_response['Body'].read().decode('utf-8')) + # 改行を取り除く + mail_title = substitute_mail_template( + mail_title_template, receive_timing, mail_message) + mail_title_without_line_break = mail_title.splitlines()[0] + logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + logger.exception( + f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append( + make_failure_item_on_error(message_id)) + continue + + try: + logger.info( + 'I-05-05 ' + + f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template = ( + mail_body_template_response['Body'].read().decode('utf-8')) + # メール本文内のプレースホルダーを置き換える + mail_body = substitute_mail_template( + mail_body_template, receive_timing, mail_message) + logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + logger.exception( + f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append( + make_failure_item_on_error(message_id)) + continue + + logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_NOTICE_TOPIC, + 'Subject': mail_title_without_line_break, + 'Message': mail_body + } + sns_client.publish(**params) + logger.info('I-05-08 メール送信指示をしました') + + batch_item_success.append(message_id) + except Exception as e: + logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue + + return batch_item_failures, batch_item_success + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') + # 処理稼働年月を取得しメモリに保持する + execute_date_today = datetime.date.today() + execute_month = execute_date_today.strftime('%Y/%m') + logger.info(f'I-01-02 処理稼働月:{execute_month}') + # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_failures = [] + # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_success = [] + # ② SQSメッセージ重複排除処理を行う + logger.info('I-02-01 メッセージ処理開始') + batch_item_failures, batch_item_success = encise_data_unreceive_check( + event["Records"], execute_month) + logger.info('I-06-01 すべてのメッセージの処理完了') + + # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する + put_success_messages_to_dynamo_db(batch_item_success) + logger.info('I-07-01 処理済みメッセージIDの記録完了') + logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') + + except Exception as e: + logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + raise e + + return batch_item_failures + + +# 動作確認用のコード +# if __name__ == '__main__': +# lambda_handler({ +# "Records": [ +# { +# "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", +# "receiptHandle": "MessageReceiptHandle", +# "body": "{\"receive_timing\": \"速報\",\"check_folder_prefix\": \"encise\",\"check_target_file_list\": \"en_quick_file_list.config\",\"notice_mail_title_template\": \"en_unreceive_notice_mail_title.config\",\"notice_mail_body_template\": \"en_unreceive_notice_mail_body.config\"\r\n}", +# "attributes": { +# "ApproximateReceiveCount": "1", +# "SentTimestamp": "1523232000000", +# "SenderId": "123456789012", +# "ApproximateFirstReceiveTimestamp": "1523232000001" +# }, +# "messageAttributes": {}, +# "md5OfBody": "{{{md5_of_body}}}", +# "eventSource": "aws:sqs", +# "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue", +# "awsRegion": "us-east-1" +# } +# ] +# }, {}) diff --git a/lambda/start-rds/start-rds.py b/lambda/start-rds/start-rds.py new file mode 100644 index 00000000..ee4f4b9b --- /dev/null +++ b/lambda/start-rds/start-rds.py @@ -0,0 +1,29 @@ +import os + +import boto3 + +client = boto3.client('rds') + +#環境変数 +AUTO_START_TAG_TAGKEY = os.environ['AUTO_START_TAG_TAGKEY'] +AUTO_START_ENABLE = os.environ['AUTO_START_ENABLE'] + +def lambda_handler(event, context): + #クラスターを停止 + clusters = client.describe_db_clusters() + for cluster in clusters['DBClusters']: + if cluster['Status'] == "stopped": + tags = client.list_tags_for_resource(ResourceName=cluster['DBClusterArn']) + for tag in tags['TagList']: + if tag['Key'] == AUTO_START_TAG_TAGKEY and tag['Value'] == AUTO_START_ENABLE: + client.start_db_cluster(DBClusterIdentifier=cluster['DBClusterIdentifier']) + + #インスタンスを停止 + instances = client.describe_db_instances() + for instance in instances['DBInstances']: + if instance['DBInstanceStatus'] == "stopped": + tags = client.list_tags_for_resource(ResourceName=instance['DBInstanceArn']) + for tag in tags['TagList']: + if tag['Key'] == AUTO_START_TAG_TAGKEY and tag['Value'] == AUTO_START_ENABLE: + client.start_db_instance(DBInstanceIdentifier=instance['DBInstanceIdentifier']) + diff --git a/lambda/transfer-encise-data/transfer-encise-data.py b/lambda/transfer-encise-data/transfer-encise-data.py new file mode 100644 index 00000000..0f90483c --- /dev/null +++ b/lambda/transfer-encise-data/transfer-encise-data.py @@ -0,0 +1,105 @@ +import datetime +import logging +import os +from zoneinfo import ZoneInfo + +import boto3 + +# 環境変数 +DATA_IMPORT_BUCKET = os.environ["DATA_IMPORT_BUCKET"] +ENCISE_BACKUP_BUCKET = os.environ["ENCISE_BACKUP_BUCKET"] +ENCISE_TARGET_FOLDER = os.environ["ENCISE_TARGET_FOLDER"] +LOG_LEVEL = os.environ["LOG_LEVEL"] +TZ = os.environ["TZ"] + +# 定数 +EXCLUSIVE_CONTROL_FILE_EXT = '.doing' + +# S3クライアント +s3_client = boto3.client('s3') + +# logger設定 +logger = logging.getLogger() + + +def log_datetime_convert_tz(*arg): + """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" + return datetime.datetime.now(ZoneInfo(TZ)).timetuple() + + +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +formatter.converter = log_datetime_convert_tz +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Encise受信データ転送処理') + + # ② 処理開始時に受け取ったイベント情報をログに出力する + # バケット名・フォルダ名・受信データファイル名をメモリに保持 + s3_event = event["Records"][0]["s3"] + event_bucket_name = s3_event["bucket"]["name"] + event_object_key = s3_event["object"]["key"] + event_file_name = os.path.basename(event_object_key) + event_folder_name = os.path.dirname(event_object_key).split('/')[0] + logger.info(f'I-02-01 受信バケット:{event_bucket_name}') + logger.info(f'I-02-01 フォルダ名:{event_folder_name}') + logger.info(f'I-02-01 ファイル名:{event_file_name}') + + # ③ S3イベントによるLambdaの重複発火防止の為、メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルが存在するかチェックする + try: + s3_client.head_object(Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + logger.error(f'E-01-01 {event_bucket_name}/{event_object_key}は現在処理中です。処理を終了します。') + return + except Exception: + # .doingファイルが見つからなかった場合は、処理を続行する + # メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルを作成する + logger.info('I-03-01 Encise受信データを転送します') + s3_client.put_object( + Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}', Body=b'') + + # ⑤ 受信データファイルを、Enciseデータバックアップバケットにコピーする + copy_source = {'Bucket': event_bucket_name, 'Key': event_object_key} + execute_date_yyyymm = datetime.date.today().strftime('%Y/%m') + s3_client.copy_object( + Bucket=ENCISE_BACKUP_BUCKET, + Key=f'{event_folder_name}/{execute_date_yyyymm}/{event_file_name}', + CopySource=copy_source, + ContentType='text/csv', # ファイルのタイプを指定する必要があるため、ContentTypeを指定する。 + MetadataDirective='REPLACE' # ファイルのメタデータを置き換える必要があるため、MetadataDirectiveを指定する。 + ) + logger.info(f'I-04-01 Encise受信データのバックアップ完了:{ENCISE_BACKUP_BUCKET}/{event_folder_name}/{execute_date_yyyymm}/{event_file_name}') + + # ⑥ 受信データファイルを、データ登録バケットのEnciseデータ取込フォルダに移動する + s3_client.copy_object( + Bucket=DATA_IMPORT_BUCKET, + Key=f'{ENCISE_TARGET_FOLDER}/{event_file_name}', + CopySource=copy_source, + ContentType='text/csv', # ファイルのタイプを指定する必要があるため、ContentTypeを指定する。 + MetadataDirective='REPLACE' # ファイルのメタデータを置き換える必要があるため、MetadataDirectiveを指定する。 + ) + # コピー後、元のバケットからは削除する + s3_client.delete_object(Bucket=event_bucket_name, Key=event_object_key) + logger.info(f'I-05-01 Encise受信データの転送完了:{DATA_IMPORT_BUCKET}/{ENCISE_TARGET_FOLDER}/{event_file_name}') + + # ⑦ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する + s3_client.delete_object(Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + + logger.info('I-01-06 処理終了 Encise受信データ転送処理') + + except Exception as e: + logger.exception(f'想定外のエラーが発生しました。処理を終了します。 例外内容:{e}') + raise e + + return diff --git a/rds_mysql/stored_procedure/crm_data_sync.sql b/rds_mysql/stored_procedure/internal02/crm_data_sync.sql similarity index 93% rename from rds_mysql/stored_procedure/crm_data_sync.sql rename to rds_mysql/stored_procedure/internal02/crm_data_sync.sql index bb3f3354..5698c5e5 100644 --- a/rds_mysql/stored_procedure/crm_data_sync.sql +++ b/rds_mysql/stored_procedure/internal02/crm_data_sync.sql @@ -2,7 +2,7 @@ -- $$から始まる文字は後からREPLACEする文字を示す独自ルール -- crm_data_syncストアドプロシージャは、同一セッション内での並列処理を実行することができない -- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している -CREATE PROCEDURE src02.crm_data_sync(target_table VARCHAR(255), target_table_all VARCHAR(255), target_column VARCHAR(255)) +CREATE PROCEDURE internal02.crm_data_sync(target_table VARCHAR(255), target_table_all VARCHAR(255), target_column VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- 例外処理 diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Detail_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Detail_vod__c.sql new file mode 100644 index 00000000..3a08ae36 --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Detail_vod__c.sql @@ -0,0 +1,89 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当プロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Call2_Detail_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, medaca_parent_record_type_id FROM internal02.crm_Call2_Detail_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Call2_Detail_vod__c( + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Is_Parent_Call_vod__c, Call2_vod__c, Product_vod__c, Detail_Priority_vod__c, Mobile_ID_vod__c, Override_Lock_vod__c, Type_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + SELECT + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Is_Parent_Call_vod__c, Call2_vod__c, Product_vod__c, Detail_Priority_vod__c, Mobile_ID_vod__c, Override_Lock_vod__c, Type_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + FROM + internal02.crm_Call2_Detail_vod__c AS internaltb + WHERE + internaltb.Id = ? + ON DUPLICATE KEY UPDATE + IsDeleted=internaltb.IsDeleted, Name=internaltb.Name, CreatedDate=internaltb.CreatedDate, CreatedById=internaltb.CreatedById, + LastModifiedDate=internaltb.LastModifiedDate, LastModifiedById=internaltb.LastModifiedById, SystemModstamp=internaltb.SystemModstamp, + MayEdit=internaltb.MayEdit, IsLocked=internaltb.IsLocked, Is_Parent_Call_vod__c=internaltb.Is_Parent_Call_vod__c, Call2_vod__c=internaltb.Call2_vod__c, + Product_vod__c=internaltb.Product_vod__c, Detail_Priority_vod__c=internaltb.Detail_Priority_vod__c, Mobile_ID_vod__c=internaltb.Mobile_ID_vod__c, + Override_Lock_vod__c=internaltb.Override_Lock_vod__c, Type_vod__c=internaltb.Type_vod__c, medaca_parent_record_type_id=internaltb.medaca_parent_record_type_id, + file_name=internaltb.file_name, file_row_cnt=internaltb.file_row_cnt, + upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Call2_Detail_vod__c', 'medaca_parent_record_type_id', target_column_value); + SET @temp_table_id = temp_table_id; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Discussion_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Discussion_vod__c.sql new file mode 100644 index 00000000..f1de1f3c --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Discussion_vod__c.sql @@ -0,0 +1,106 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当プロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Call2_Discussion_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, medaca_parent_record_type_id FROM internal02.crm_Call2_Discussion_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Call2_Discussion_vod__c( + Id, IsDeleted, Name, RecordTypeId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Account_vod__c, Call2_vod__c, Activity__c, Comments__c, Contact_vod__c, Call_Date_vod__c, Product_Strategy_vod__c, + Product_Tactic_vod__c, Restricted_Comments__c, Product_vod__c, Presentation__c, Discussion_Topics__c, Slides__c, User_vod__c, + Indication__c, Mobile_ID_vod__c, Medical_Event_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, zvod_Product_Map_vod__c, + Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Account_Tactic_vod__c, MSJ_Material_Type__c, MSJ_Discussion_Contents__c, + MSJ_IST_Minutes__c, MSJ_Off_Label_Minutes__c, MSJ_Discussion_Objectives__c, MSJ_Insight__c, EMDS_Materials__c, EMDS_Topic__c, + MSJ_Visit_Purpose__c, MSJ_Insight_Count__c, medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, + ins_date, upd_user, upd_date) + SELECT + Id, IsDeleted, Name, RecordTypeId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Account_vod__c, Call2_vod__c, Activity__c, Comments__c, Contact_vod__c, Call_Date_vod__c, Product_Strategy_vod__c, + Product_Tactic_vod__c, Restricted_Comments__c, Product_vod__c, Presentation__c, Discussion_Topics__c, Slides__c, User_vod__c, + Indication__c, Mobile_ID_vod__c, Medical_Event_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, zvod_Product_Map_vod__c, + Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Account_Tactic_vod__c, MSJ_Material_Type__c, MSJ_Discussion_Contents__c, + MSJ_IST_Minutes__c, MSJ_Off_Label_Minutes__c, MSJ_Discussion_Objectives__c, MSJ_Insight__c, EMDS_Materials__c, EMDS_Topic__c, + MSJ_Visit_Purpose__c, MSJ_Insight_Count__c, medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, + ins_date, upd_user, upd_date + FROM + internal02.crm_Call2_Discussion_vod__c AS internaltb + WHERE + internaltb.Id = ? + ON DUPLICATE KEY UPDATE + IsDeleted=internaltb.IsDeleted, Name=internaltb.Name, RecordTypeId=internaltb.RecordTypeId, CreatedDate=internaltb.CreatedDate, CreatedById=internaltb.CreatedById, + LastModifiedDate=internaltb.LastModifiedDate, LastModifiedById=internaltb.LastModifiedById, SystemModstamp=internaltb.SystemModstamp, MayEdit=internaltb.MayEdit, + IsLocked=internaltb.IsLocked, Account_vod__c=internaltb.Account_vod__c, Call2_vod__c=internaltb.Call2_vod__c, Activity__c=internaltb.Activity__c, + Comments__c=internaltb.Comments__c, Contact_vod__c=internaltb.Contact_vod__c, Call_Date_vod__c=internaltb.Call_Date_vod__c, Product_Strategy_vod__c=internaltb.Product_Strategy_vod__c, + Product_Tactic_vod__c=internaltb.Product_Tactic_vod__c, Restricted_Comments__c=internaltb.Restricted_Comments__c, Product_vod__c=internaltb.Product_vod__c, Presentation__c=internaltb.Presentation__c, + Discussion_Topics__c=internaltb.Discussion_Topics__c, Slides__c=internaltb.Slides__c, User_vod__c=internaltb.User_vod__c, Indication__c=internaltb.Indication__c, Mobile_ID_vod__c=internaltb.Mobile_ID_vod__c, + Medical_Event_vod__c=internaltb.Medical_Event_vod__c, Is_Parent_Call_vod__c=internaltb.Is_Parent_Call_vod__c, Override_Lock_vod__c=internaltb.Override_Lock_vod__c, + zvod_Product_Map_vod__c=internaltb.zvod_Product_Map_vod__c, Attendee_Type_vod__c=internaltb.Attendee_Type_vod__c, Entity_Reference_Id_vod__c=internaltb.Entity_Reference_Id_vod__c, + Account_Tactic_vod__c=internaltb.Account_Tactic_vod__c, MSJ_Material_Type__c=internaltb.MSJ_Material_Type__c, MSJ_Discussion_Contents__c=internaltb.MSJ_Discussion_Contents__c, + MSJ_IST_Minutes__c=internaltb.MSJ_IST_Minutes__c, MSJ_Off_Label_Minutes__c=internaltb.MSJ_Off_Label_Minutes__c, MSJ_Discussion_Objectives__c=internaltb.MSJ_Discussion_Objectives__c, + MSJ_Insight__c=internaltb.MSJ_Insight__c, EMDS_Materials__c=internaltb.EMDS_Materials__c, EMDS_Topic__c=internaltb.EMDS_Topic__c, + MSJ_Visit_Purpose__c=internaltb.MSJ_Visit_Purpose__c, MSJ_Insight_Count__c=internaltb.MSJ_Insight_Count__c, + medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, file_name=internaltb.file_name, file_row_cnt=internaltb.file_row_cnt, + upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Call2_Discussion_vod__c', 'medaca_parent_record_type_id', target_column_value); + SET @temp_table_id = temp_table_id; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql new file mode 100644 index 00000000..43feb28f --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql @@ -0,0 +1,109 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当プロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Call2_Key_Message_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, medaca_parent_record_type_id FROM internal02.crm_Call2_Key_Message_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Call2_Key_Message_vod__c + (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, + Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, + Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, + Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + SELECT + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, + Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, + Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, + Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + FROM + internal02.crm_Call2_Key_Message_vod__c AS internaltb + WHERE + internaltb.Id = ? + ON DUPLICATE KEY UPDATE + IsDeleted = internaltb.IsDeleted, Name = internaltb.Name, CreatedDate = internaltb.CreatedDate, + CreatedById = internaltb.CreatedById, LastModifiedDate = internaltb.LastModifiedDate, + LastModifiedById = internaltb.LastModifiedById, SystemModstamp = internaltb.SystemModstamp, + MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked, Account_vod__c = internaltb.Account_vod__c, + Call2_vod__c = internaltb.Call2_vod__c, Reaction_vod__c = internaltb.Reaction_vod__c, + Product_vod__c = internaltb.Product_vod__c, Key_Message_vod__c = internaltb.Key_Message_vod__c, + Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c, Contact_vod__c = internaltb.Contact_vod__c, + Call_Date_vod__c = internaltb.Call_Date_vod__c, User_vod__c = internaltb.User_vod__c, + Category_vod__c = internaltb.Category_vod__c, Vehicle_vod__c = internaltb.Vehicle_vod__c, + Is_Parent_Call_vod__c = internaltb.Is_Parent_Call_vod__c, Override_Lock_vod__c = internaltb.Override_Lock_vod__c, + CLM_ID_vod__c = internaltb.CLM_ID_vod__c, Slide_Version_vod__c = internaltb.Slide_Version_vod__c, + Duration_vod__c = internaltb.Duration_vod__c, Presentation_ID_vod__c = internaltb.Presentation_ID_vod__c, + Start_Time_vod__c = internaltb.Start_Time_vod__c, Attendee_Type_vod__c = internaltb.Attendee_Type_vod__c, + Entity_Reference_Id_vod__c = internaltb.Entity_Reference_Id_vod__c, Segment_vod__c = internaltb.Segment_vod__c, + Display_Order_vod__c = internaltb.Display_Order_vod__c, Clm_Presentation_Name_vod__c = internaltb.Clm_Presentation_Name_vod__c, + Clm_Presentation_Version_vod__c = internaltb.Clm_Presentation_Version_vod__c, + Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c, Share_Channel_vod__c = internaltb.Share_Channel_vod__c, + medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, file_name = internaltb.file_name, + file_row_cnt = internaltb.file_row_cnt, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Call2_Key_Message_vod__c', 'medaca_parent_record_type_id', target_column_value); + SET @temp_table_id = temp_table_id; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql new file mode 100644 index 00000000..c5f8c00d --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql @@ -0,0 +1,278 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当プロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Call2_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, RecordTypeId FROM internal02.crm_Call2_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Call2_vod__c + (Id, OwnerId, IsDeleted, Name, RecordTypeId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, + SystemModstamp, LastActivityDate, MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Call_Comments_vod__c, + Sample_Card_vod__c, Add_Detail_vod__c, Property_vod__c, Account_vod__c, zvod_Product_Discussion_vod__c, + Status_vod__c, Parent_Address_vod__c, Account_Plan_vod__c, zvod_SaveNew_vod__c, Next_Call_Notes_vod__c, + Pre_Call_Notes_vod__c, Mobile_ID_vod__c, zvod_Account_Credentials_vod_c_vod__c, + zvod_Account_Preferred_Name_vod_c_vod__c, zvod_Account_Sample_Status_vod_c_vod__c, zvod_Attendees_vod__c, + zvod_Key_Messages_vod__c, zvod_Detailing_vod__c, zvod_Expenses_vod__c, zvod_Followup_vod__c, zvod_Samples_vod__c, + zvod_Save_vod__c, zvod_Submit_vod__c, zvod_Delete_vod__c, Activity_Type__c, Significant_Event__c, Location_vod__c, + Subject_vod__c, Unlock_vod__c, Call_Datetime_vod__c, Disbursed_To_vod__c, Disclaimer_vod__c, Request_Receipt_vod__c, + Signature_Date_vod__c, Signature_vod__c, Territory_vod__c, Submitted_By_Mobile_vod__c, Call_Type_vod__c, + Add_Key_Message_vod__c, Address_vod__c, Attendees_vod__c, Attendee_Type_vod__c, Call_Date_vod__c, + Detailed_Products_vod__c, No_Disbursement_vod__c, Parent_Call_vod__c, User_vod__c, Contact_vod__c, + zvod_Entity_vod__c, Medical_Event_vod__c, Mobile_Created_Datetime_vod__c, Mobile_Last_Modified_Datetime_vod__c, + License_vod__c, Is_Parent_Call_vod__c, Entity_Display_Name_vod__c, Override_Lock_vod__c, Last_Device_vod__c, + Ship_Address_Line_1_vod__c, Ship_Address_Line_2_vod__c, Ship_City_vod__c, Ship_Country_vod__c, + Ship_License_Expiration_Date_vod__c, Ship_License_Status_vod__c, Ship_License_vod__c, Ship_State_vod__c, + Ship_To_Address_vod__c, Ship_Zip_vod__c, Ship_To_Address_Text_vod__c, CLM_vod__c, zvod_CLMDetails_vod__c, + Is_Sampled_Call_vod__c, zvod_Surveys_vod__c, Presentations_vod__c, Entity_Reference_Id_vod__c, + Error_Reference_Call_vod__c, Duration_vod__c, Color_vod__c, Allowed_Products_vod__c, zvod_Attachments_vod__c, + Sample_Card_Reason_vod__c, ASSMCA_vod__c, Address_Line_1_vod__c, Address_Line_2_vod__c, City_vod__c, + DEA_Address_Line_1_vod__c, DEA_Address_Line_2_vod__c, DEA_Address_vod__c, DEA_City_vod__c, + DEA_Expiration_Date_vod__c, DEA_State_vod__c, DEA_Zip_4_vod__c, DEA_Zip_vod__c, DEA_vod__c, Ship_Zip_4_vod__c, + State_vod__c, Zip_4_vod__c, Zip_vod__c, Sample_Send_Card_vod__c, zvod_Address_vod_c_DEA_Status_vod_c_vod__c, + Signature_Page_Image_vod__c, Credentials_vod__c, Salutation_vod__c, zvod_Account_Call_Reminder_vod_c_vod__c, + MSJ_Meeting_Duration__c, MSJ_Double_Visit_AM__c, zvod_Business_Account_vod__c, Product_Priority_1_vod__c, + Product_Priority_2_vod__c, Product_Priority_3_vod__c, Product_Priority_4_vod__c, Product_Priority_5_vod__c, + zvod_More_Actions_vod__c, zvod_Call_Conflict_Status_vod__c, Signature_Timestamp_vod__c, Expense_Amount_vod__c, + Total_Expense_Attendees_Count_vod__c, Attendee_list_vod__c, Expense_Post_Status_vod__c, Attendee_Post_Status_vod__c, + Expense_System_External_ID_vod__c, Incurred_Expense_vod__c, Assigner_vod__c, Assignment_Datetime_vod__c, + zvod_Call_Objective_vod__c, Signature_Location_Longitude_vod__c, Signature_Location_Latitude_vod__c, + Location_Services_Status_vod__c, MSJ_Double_Visit_Other__c, MSJ_Comment__c, MSJ_For_Reporting__c, + MSJ_Number_of_Attendees__c, MSJ_Main_Dept__c, Planned_Type_vjh__c, Cobrowse_URL_Participant_vod__c, + MSJ_Activity_Method_Text__c, MSJ_Activity_Method__c, MSJ_Classification__c, MSJ_Double_Visit_MSL__c, + MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, Suggestion_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, + MSJ_Patient_Follow__c, Child_Account_Id_vod__c, Child_Account_vod__c, Location_Id_vod__c, Location_Name_vod__c, + MSJ_Comments_about_technology__c, Remote_Meeting_vod__c, Veeva_Remote_Meeting_Id_vod__c, MSJ_Activity_Type_Report__c, + MSJ_Activity_Type__c, MSJ_Activity__c, MSJ_Comments__c, MSJ_Therapy__c, MSJ_Time_Hrs__c, EMDS_CO_Reference__c, + EMDS_Call_Sub_Type__c, EMDS_Call_Type__c, EMDS_Call_Unsuccessful__c, EMDS_Congress_Type__c, EMDS_Date_of_Service__c, + EMDS_Fertility_DisInterest__c, EMDS_Fertility_Interest__c, EMDS_Installed_Equipment__c, EMDS_Pipeline_Stage_Value__c, + EMDS_Pipeline_Stage__c, EMDS_Pipeline__c, EMDS_Reason_for_Call__c, EMDS_Training_Completed__c, MSJ_BrainStorming__c, + MSJ_SIPAGL_1A__c, MSJ_SIPAGL_1B__c, MSJ_SIPAGL_2__c, MSJ_SIPAGL_3__c, MSJ_SIPAGL_4A__c, MSJ_SIPAGL_5A__c, + MSJ_SIPAGL_comment__c, MSJ_SIPAGL_4B__c, MSJ_SIPAGL_5B__c, Location_Text_vod__c, Call_Channel_vod__c, + MSJ_Scientific_Interaction__c, MSJ_Activity_Email_Reply__c, MSJ_Interaction_Duration__c, MSJ_SIPAGL_1A_date__c, + MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, Meeting_Request_vod__c, Phone_vod__c, Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c, + file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + SELECT + Id, OwnerId, IsDeleted, Name, RecordTypeId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, + SystemModstamp, LastActivityDate, MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Call_Comments_vod__c, + Sample_Card_vod__c, Add_Detail_vod__c, Property_vod__c, Account_vod__c, zvod_Product_Discussion_vod__c, + Status_vod__c, Parent_Address_vod__c, Account_Plan_vod__c, zvod_SaveNew_vod__c, Next_Call_Notes_vod__c, + Pre_Call_Notes_vod__c, Mobile_ID_vod__c, zvod_Account_Credentials_vod_c_vod__c, + zvod_Account_Preferred_Name_vod_c_vod__c, zvod_Account_Sample_Status_vod_c_vod__c, zvod_Attendees_vod__c, + zvod_Key_Messages_vod__c, zvod_Detailing_vod__c, zvod_Expenses_vod__c, zvod_Followup_vod__c, zvod_Samples_vod__c, + zvod_Save_vod__c, zvod_Submit_vod__c, zvod_Delete_vod__c, Activity_Type__c, Significant_Event__c, Location_vod__c, + Subject_vod__c, Unlock_vod__c, Call_Datetime_vod__c, Disbursed_To_vod__c, Disclaimer_vod__c, Request_Receipt_vod__c, + Signature_Date_vod__c, Signature_vod__c, Territory_vod__c, Submitted_By_Mobile_vod__c, Call_Type_vod__c, + Add_Key_Message_vod__c, Address_vod__c, Attendees_vod__c, Attendee_Type_vod__c, Call_Date_vod__c, + Detailed_Products_vod__c, No_Disbursement_vod__c, Parent_Call_vod__c, User_vod__c, Contact_vod__c, + zvod_Entity_vod__c, Medical_Event_vod__c, Mobile_Created_Datetime_vod__c, Mobile_Last_Modified_Datetime_vod__c, + License_vod__c, Is_Parent_Call_vod__c, Entity_Display_Name_vod__c, Override_Lock_vod__c, Last_Device_vod__c, + Ship_Address_Line_1_vod__c, Ship_Address_Line_2_vod__c, Ship_City_vod__c, Ship_Country_vod__c, + Ship_License_Expiration_Date_vod__c, Ship_License_Status_vod__c, Ship_License_vod__c, Ship_State_vod__c, + Ship_To_Address_vod__c, Ship_Zip_vod__c, Ship_To_Address_Text_vod__c, CLM_vod__c, zvod_CLMDetails_vod__c, + Is_Sampled_Call_vod__c, zvod_Surveys_vod__c, Presentations_vod__c, Entity_Reference_Id_vod__c, + Error_Reference_Call_vod__c, Duration_vod__c, Color_vod__c, Allowed_Products_vod__c, zvod_Attachments_vod__c, + Sample_Card_Reason_vod__c, ASSMCA_vod__c, Address_Line_1_vod__c, Address_Line_2_vod__c, City_vod__c, + DEA_Address_Line_1_vod__c, DEA_Address_Line_2_vod__c, DEA_Address_vod__c, DEA_City_vod__c, + DEA_Expiration_Date_vod__c, DEA_State_vod__c, DEA_Zip_4_vod__c, DEA_Zip_vod__c, DEA_vod__c, Ship_Zip_4_vod__c, + State_vod__c, Zip_4_vod__c, Zip_vod__c, Sample_Send_Card_vod__c, zvod_Address_vod_c_DEA_Status_vod_c_vod__c, + Signature_Page_Image_vod__c, Credentials_vod__c, Salutation_vod__c, zvod_Account_Call_Reminder_vod_c_vod__c, + MSJ_Meeting_Duration__c, MSJ_Double_Visit_AM__c, zvod_Business_Account_vod__c, Product_Priority_1_vod__c, + Product_Priority_2_vod__c, Product_Priority_3_vod__c, Product_Priority_4_vod__c, Product_Priority_5_vod__c, + zvod_More_Actions_vod__c, zvod_Call_Conflict_Status_vod__c, Signature_Timestamp_vod__c, Expense_Amount_vod__c, + Total_Expense_Attendees_Count_vod__c, Attendee_list_vod__c, Expense_Post_Status_vod__c, Attendee_Post_Status_vod__c, + Expense_System_External_ID_vod__c, Incurred_Expense_vod__c, Assigner_vod__c, Assignment_Datetime_vod__c, + zvod_Call_Objective_vod__c, Signature_Location_Longitude_vod__c, Signature_Location_Latitude_vod__c, + Location_Services_Status_vod__c, MSJ_Double_Visit_Other__c, MSJ_Comment__c, MSJ_For_Reporting__c, + MSJ_Number_of_Attendees__c, MSJ_Main_Dept__c, Planned_Type_vjh__c, Cobrowse_URL_Participant_vod__c, + MSJ_Activity_Method_Text__c, MSJ_Activity_Method__c, MSJ_Classification__c, MSJ_Double_Visit_MSL__c, + MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, Suggestion_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, + MSJ_Patient_Follow__c, Child_Account_Id_vod__c, Child_Account_vod__c, Location_Id_vod__c, Location_Name_vod__c, + MSJ_Comments_about_technology__c, Remote_Meeting_vod__c, Veeva_Remote_Meeting_Id_vod__c, MSJ_Activity_Type_Report__c, + MSJ_Activity_Type__c, MSJ_Activity__c, MSJ_Comments__c, MSJ_Therapy__c, MSJ_Time_Hrs__c, EMDS_CO_Reference__c, + EMDS_Call_Sub_Type__c, EMDS_Call_Type__c, EMDS_Call_Unsuccessful__c, EMDS_Congress_Type__c, EMDS_Date_of_Service__c, + EMDS_Fertility_DisInterest__c, EMDS_Fertility_Interest__c, EMDS_Installed_Equipment__c, EMDS_Pipeline_Stage_Value__c, + EMDS_Pipeline_Stage__c, EMDS_Pipeline__c, EMDS_Reason_for_Call__c, EMDS_Training_Completed__c, MSJ_BrainStorming__c, + MSJ_SIPAGL_1A__c, MSJ_SIPAGL_1B__c, MSJ_SIPAGL_2__c, MSJ_SIPAGL_3__c, MSJ_SIPAGL_4A__c, MSJ_SIPAGL_5A__c, + MSJ_SIPAGL_comment__c, MSJ_SIPAGL_4B__c, MSJ_SIPAGL_5B__c, Location_Text_vod__c, Call_Channel_vod__c, + MSJ_Scientific_Interaction__c, MSJ_Activity_Email_Reply__c, MSJ_Interaction_Duration__c, MSJ_SIPAGL_1A_date__c, + MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, Meeting_Request_vod__c, Phone_vod__c, Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c, + file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + FROM + internal02.crm_Call2_vod__c AS internaltb + WHERE + internaltb.Id = ? + ON DUPLICATE KEY UPDATE + OwnerId = internaltb.OwnerId, IsDeleted = internaltb.IsDeleted, Name = internaltb.Name, + RecordTypeId = internaltb.RecordTypeId, CreatedDate = internaltb.CreatedDate, CreatedById = internaltb.CreatedById, + LastModifiedDate = internaltb.LastModifiedDate, LastModifiedById = internaltb.LastModifiedById, + SystemModstamp = internaltb.SystemModstamp, LastActivityDate = internaltb.LastActivityDate, + MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked, LastViewedDate = internaltb.LastViewedDate, + LastReferencedDate = internaltb.LastReferencedDate, Call_Comments_vod__c = internaltb.Call_Comments_vod__c, + Sample_Card_vod__c = internaltb.Sample_Card_vod__c, Add_Detail_vod__c = internaltb.Add_Detail_vod__c, + Property_vod__c = internaltb.Property_vod__c, Account_vod__c = internaltb.Account_vod__c, + zvod_Product_Discussion_vod__c = internaltb.zvod_Product_Discussion_vod__c, Status_vod__c = internaltb.Status_vod__c, + Parent_Address_vod__c = internaltb.Parent_Address_vod__c, Account_Plan_vod__c = internaltb.Account_Plan_vod__c, + zvod_SaveNew_vod__c = internaltb.zvod_SaveNew_vod__c, Next_Call_Notes_vod__c = internaltb.Next_Call_Notes_vod__c, + Pre_Call_Notes_vod__c = internaltb.Pre_Call_Notes_vod__c, Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c, + zvod_Account_Credentials_vod_c_vod__c = internaltb.zvod_Account_Credentials_vod_c_vod__c, + zvod_Account_Preferred_Name_vod_c_vod__c = internaltb.zvod_Account_Preferred_Name_vod_c_vod__c, + zvod_Account_Sample_Status_vod_c_vod__c = internaltb.zvod_Account_Sample_Status_vod_c_vod__c, + zvod_Attendees_vod__c = internaltb.zvod_Attendees_vod__c, zvod_Key_Messages_vod__c = internaltb.zvod_Key_Messages_vod__c, + zvod_Detailing_vod__c = internaltb.zvod_Detailing_vod__c, zvod_Expenses_vod__c = internaltb.zvod_Expenses_vod__c, + zvod_Followup_vod__c = internaltb.zvod_Followup_vod__c, zvod_Samples_vod__c = internaltb.zvod_Samples_vod__c, + zvod_Save_vod__c = internaltb.zvod_Save_vod__c, zvod_Submit_vod__c = internaltb.zvod_Submit_vod__c, + zvod_Delete_vod__c = internaltb.zvod_Delete_vod__c, Activity_Type__c = internaltb.Activity_Type__c, + Significant_Event__c = internaltb.Significant_Event__c, Location_vod__c = internaltb.Location_vod__c, + Subject_vod__c = internaltb.Subject_vod__c, Unlock_vod__c = internaltb.Unlock_vod__c, + Call_Datetime_vod__c = internaltb.Call_Datetime_vod__c, Disbursed_To_vod__c = internaltb.Disbursed_To_vod__c, + Disclaimer_vod__c = internaltb.Disclaimer_vod__c, Request_Receipt_vod__c = internaltb.Request_Receipt_vod__c, + Signature_Date_vod__c = internaltb.Signature_Date_vod__c, Signature_vod__c = internaltb.Signature_vod__c, + Territory_vod__c = internaltb.Territory_vod__c, Submitted_By_Mobile_vod__c = internaltb.Submitted_By_Mobile_vod__c, + Call_Type_vod__c = internaltb.Call_Type_vod__c, Add_Key_Message_vod__c = internaltb.Add_Key_Message_vod__c, + Address_vod__c = internaltb.Address_vod__c, Attendees_vod__c = internaltb.Attendees_vod__c, + Attendee_Type_vod__c = internaltb.Attendee_Type_vod__c, Call_Date_vod__c = internaltb.Call_Date_vod__c, + Detailed_Products_vod__c = internaltb.Detailed_Products_vod__c, No_Disbursement_vod__c = internaltb.No_Disbursement_vod__c, + Parent_Call_vod__c = internaltb.Parent_Call_vod__c, User_vod__c = internaltb.User_vod__c, + Contact_vod__c = internaltb.Contact_vod__c, zvod_Entity_vod__c = internaltb.zvod_Entity_vod__c, + Medical_Event_vod__c = internaltb.Medical_Event_vod__c, Mobile_Created_Datetime_vod__c = internaltb.Mobile_Created_Datetime_vod__c, + Mobile_Last_Modified_Datetime_vod__c = internaltb.Mobile_Last_Modified_Datetime_vod__c, License_vod__c = internaltb.License_vod__c, + Is_Parent_Call_vod__c = internaltb.Is_Parent_Call_vod__c, Entity_Display_Name_vod__c = internaltb.Entity_Display_Name_vod__c, + Override_Lock_vod__c = internaltb.Override_Lock_vod__c, Last_Device_vod__c = internaltb.Last_Device_vod__c, + Ship_Address_Line_1_vod__c = internaltb.Ship_Address_Line_1_vod__c, Ship_Address_Line_2_vod__c = internaltb.Ship_Address_Line_2_vod__c, + Ship_City_vod__c = internaltb.Ship_City_vod__c, Ship_Country_vod__c = internaltb.Ship_Country_vod__c, + Ship_License_Expiration_Date_vod__c = internaltb.Ship_License_Expiration_Date_vod__c, + Ship_License_Status_vod__c = internaltb.Ship_License_Status_vod__c, Ship_License_vod__c = internaltb.Ship_License_vod__c, + Ship_State_vod__c = internaltb.Ship_State_vod__c, Ship_To_Address_vod__c = internaltb.Ship_To_Address_vod__c, + Ship_Zip_vod__c = internaltb.Ship_Zip_vod__c, Ship_To_Address_Text_vod__c = internaltb.Ship_To_Address_Text_vod__c, + CLM_vod__c = internaltb.CLM_vod__c, zvod_CLMDetails_vod__c = internaltb.zvod_CLMDetails_vod__c, + Is_Sampled_Call_vod__c = internaltb.Is_Sampled_Call_vod__c, zvod_Surveys_vod__c = internaltb.zvod_Surveys_vod__c, + Presentations_vod__c = internaltb.Presentations_vod__c, Entity_Reference_Id_vod__c = internaltb.Entity_Reference_Id_vod__c, + Error_Reference_Call_vod__c = internaltb.Error_Reference_Call_vod__c, Duration_vod__c = internaltb.Duration_vod__c, + Color_vod__c = internaltb.Color_vod__c, Allowed_Products_vod__c = internaltb.Allowed_Products_vod__c, + zvod_Attachments_vod__c = internaltb.zvod_Attachments_vod__c, Sample_Card_Reason_vod__c = internaltb.Sample_Card_Reason_vod__c, + ASSMCA_vod__c = internaltb.ASSMCA_vod__c, Address_Line_1_vod__c = internaltb.Address_Line_1_vod__c, + Address_Line_2_vod__c = internaltb.Address_Line_2_vod__c, City_vod__c = internaltb.City_vod__c, + DEA_Address_Line_1_vod__c = internaltb.DEA_Address_Line_1_vod__c, DEA_Address_Line_2_vod__c = internaltb.DEA_Address_Line_2_vod__c, + DEA_Address_vod__c = internaltb.DEA_Address_vod__c, DEA_City_vod__c = internaltb.DEA_City_vod__c, + DEA_Expiration_Date_vod__c = internaltb.DEA_Expiration_Date_vod__c, DEA_State_vod__c = internaltb.DEA_State_vod__c, + DEA_Zip_4_vod__c = internaltb.DEA_Zip_4_vod__c, DEA_Zip_vod__c = internaltb.DEA_Zip_vod__c, DEA_vod__c = internaltb.DEA_vod__c, + Ship_Zip_4_vod__c = internaltb.Ship_Zip_4_vod__c, State_vod__c = internaltb.State_vod__c, Zip_4_vod__c = internaltb.Zip_4_vod__c, + Zip_vod__c = internaltb.Zip_vod__c, Sample_Send_Card_vod__c = internaltb.Sample_Send_Card_vod__c, + zvod_Address_vod_c_DEA_Status_vod_c_vod__c = internaltb.zvod_Address_vod_c_DEA_Status_vod_c_vod__c, + Signature_Page_Image_vod__c = internaltb.Signature_Page_Image_vod__c, Credentials_vod__c = internaltb.Credentials_vod__c, + Salutation_vod__c = internaltb.Salutation_vod__c, + zvod_Account_Call_Reminder_vod_c_vod__c = internaltb.zvod_Account_Call_Reminder_vod_c_vod__c, + MSJ_Meeting_Duration__c = internaltb.MSJ_Meeting_Duration__c, MSJ_Double_Visit_AM__c = internaltb.MSJ_Double_Visit_AM__c, + zvod_Business_Account_vod__c = internaltb.zvod_Business_Account_vod__c, Product_Priority_1_vod__c = internaltb.Product_Priority_1_vod__c, + Product_Priority_2_vod__c = internaltb.Product_Priority_2_vod__c, Product_Priority_3_vod__c = internaltb.Product_Priority_3_vod__c, + Product_Priority_4_vod__c = internaltb.Product_Priority_4_vod__c, Product_Priority_5_vod__c = internaltb.Product_Priority_5_vod__c, + zvod_More_Actions_vod__c = internaltb.zvod_More_Actions_vod__c, + zvod_Call_Conflict_Status_vod__c = internaltb.zvod_Call_Conflict_Status_vod__c, + Signature_Timestamp_vod__c = internaltb.Signature_Timestamp_vod__c, Expense_Amount_vod__c = internaltb.Expense_Amount_vod__c, + Total_Expense_Attendees_Count_vod__c = internaltb.Total_Expense_Attendees_Count_vod__c, + Attendee_list_vod__c = internaltb.Attendee_list_vod__c, Expense_Post_Status_vod__c = internaltb.Expense_Post_Status_vod__c, + Attendee_Post_Status_vod__c = internaltb.Attendee_Post_Status_vod__c, + Expense_System_External_ID_vod__c = internaltb.Expense_System_External_ID_vod__c, + Incurred_Expense_vod__c = internaltb.Incurred_Expense_vod__c, Assigner_vod__c = internaltb.Assigner_vod__c, + Assignment_Datetime_vod__c = internaltb.Assignment_Datetime_vod__c, zvod_Call_Objective_vod__c = internaltb.zvod_Call_Objective_vod__c, + Signature_Location_Longitude_vod__c = internaltb.Signature_Location_Longitude_vod__c, + Signature_Location_Latitude_vod__c = internaltb.Signature_Location_Latitude_vod__c, + Location_Services_Status_vod__c = internaltb.Location_Services_Status_vod__c, + MSJ_Double_Visit_Other__c = internaltb.MSJ_Double_Visit_Other__c, MSJ_Comment__c = internaltb.MSJ_Comment__c, + MSJ_For_Reporting__c = internaltb.MSJ_For_Reporting__c, MSJ_Number_of_Attendees__c = internaltb.MSJ_Number_of_Attendees__c, + MSJ_Main_Dept__c = internaltb.MSJ_Main_Dept__c, Planned_Type_vjh__c = internaltb.Planned_Type_vjh__c, + Cobrowse_URL_Participant_vod__c = internaltb.Cobrowse_URL_Participant_vod__c, MSJ_Activity_Method_Text__c = internaltb.MSJ_Activity_Method_Text__c, + MSJ_Activity_Method__c = internaltb.MSJ_Activity_Method__c, MSJ_Classification__c = internaltb.MSJ_Classification__c, + MSJ_Double_Visit_MSL__c = internaltb.MSJ_Double_Visit_MSL__c, MSJ_MSL_Comment_for_MR__c = internaltb.MSJ_MSL_Comment_for_MR__c, + MSJ_APD__c = internaltb.MSJ_APD__c, Medical_Inquiry_vod__c = internaltb.Medical_Inquiry_vod__c, Suggestion_vod__c = internaltb.Suggestion_vod__c, + MSJ_Call_Type_MSJ__c = internaltb.MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c = internaltb.MSJ_Prescription_Request__c, + MSJ_Patient_Follow__c = internaltb.MSJ_Patient_Follow__c, Child_Account_Id_vod__c = internaltb.Child_Account_Id_vod__c, + Child_Account_vod__c = internaltb.Child_Account_vod__c, Location_Id_vod__c = internaltb.Location_Id_vod__c, + Location_Name_vod__c = internaltb.Location_Name_vod__c, MSJ_Comments_about_technology__c = internaltb.MSJ_Comments_about_technology__c, + Remote_Meeting_vod__c = internaltb.Remote_Meeting_vod__c, Veeva_Remote_Meeting_Id_vod__c = internaltb.Veeva_Remote_Meeting_Id_vod__c, + MSJ_Activity_Type_Report__c = internaltb.MSJ_Activity_Type_Report__c, MSJ_Activity_Type__c = internaltb.MSJ_Activity_Type__c, + MSJ_Activity__c = internaltb.MSJ_Activity__c, MSJ_Comments__c = internaltb.MSJ_Comments__c, MSJ_Therapy__c = internaltb.MSJ_Therapy__c, + MSJ_Time_Hrs__c = internaltb.MSJ_Time_Hrs__c, EMDS_CO_Reference__c = internaltb.EMDS_CO_Reference__c, + EMDS_Call_Sub_Type__c = internaltb.EMDS_Call_Sub_Type__c, EMDS_Call_Type__c = internaltb.EMDS_Call_Type__c, + EMDS_Call_Unsuccessful__c = internaltb.EMDS_Call_Unsuccessful__c, EMDS_Congress_Type__c = internaltb.EMDS_Congress_Type__c, + EMDS_Date_of_Service__c = internaltb.EMDS_Date_of_Service__c, EMDS_Fertility_DisInterest__c = internaltb.EMDS_Fertility_DisInterest__c, + EMDS_Fertility_Interest__c = internaltb.EMDS_Fertility_Interest__c, EMDS_Installed_Equipment__c = internaltb.EMDS_Installed_Equipment__c, + EMDS_Pipeline_Stage_Value__c = internaltb.EMDS_Pipeline_Stage_Value__c, EMDS_Pipeline_Stage__c = internaltb.EMDS_Pipeline_Stage__c, + EMDS_Pipeline__c = internaltb.EMDS_Pipeline__c, EMDS_Reason_for_Call__c = internaltb.EMDS_Reason_for_Call__c, + EMDS_Training_Completed__c = internaltb.EMDS_Training_Completed__c, MSJ_BrainStorming__c = internaltb.MSJ_BrainStorming__c, + MSJ_SIPAGL_1A__c = internaltb.MSJ_SIPAGL_1A__c, MSJ_SIPAGL_1B__c = internaltb.MSJ_SIPAGL_1B__c, + MSJ_SIPAGL_2__c = internaltb.MSJ_SIPAGL_2__c, MSJ_SIPAGL_3__c = internaltb.MSJ_SIPAGL_3__c, MSJ_SIPAGL_4A__c = internaltb.MSJ_SIPAGL_4A__c, + MSJ_SIPAGL_5A__c = internaltb.MSJ_SIPAGL_5A__c, MSJ_SIPAGL_comment__c = internaltb.MSJ_SIPAGL_comment__c, + MSJ_SIPAGL_4B__c = internaltb.MSJ_SIPAGL_4B__c, MSJ_SIPAGL_5B__c = internaltb.MSJ_SIPAGL_5B__c, + Location_Text_vod__c = internaltb.Location_Text_vod__c, Call_Channel_vod__c = internaltb.Call_Channel_vod__c, + MSJ_Scientific_Interaction__c = internaltb.MSJ_Scientific_Interaction__c, + MSJ_Activity_Email_Reply__c = internaltb.MSJ_Activity_Email_Reply__c, + MSJ_Interaction_Duration__c = internaltb.MSJ_Interaction_Duration__c, + MSJ_SIPAGL_1A_date__c = internaltb.MSJ_SIPAGL_1A_date__c, MSJ_CoPromotion__c = internaltb.MSJ_CoPromotion__c, + Call_Channel_Formula_vod__c = internaltb.Call_Channel_Formula_vod__c, + Meeting_Request_vod__c = internaltb.Meeting_Request_vod__c, Phone_vod__c = internaltb.Phone_vod__c, + Detail_Section_Attribute_vod__c = internaltb.Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c = internaltb.Remote_Meeting_Type_vod__c, + file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, + upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Call2_vod__c', 'RecordTypeId', target_column_value); + SET @temp_table_id = temp_table_id; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call_Clickstream_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call_Clickstream_vod__c.sql new file mode 100644 index 00000000..dc95ad79 --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call_Clickstream_vod__c.sql @@ -0,0 +1,109 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当プロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Call_Clickstream_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, medaca_parent_record_type_id FROM internal02.crm_Call_Clickstream_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Call_Clickstream_vod__c + (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Answer_vod__c, Call_vod__c, Key_Message_vod__c, Mobile_ID_vod__c, Popup_Opened_vod__c, + Possible_Answers_vod__c, Presentation_ID_vod__c, Product_vod__c, Range_Value_vod__c, Rollover_Entered_vod__c, + Selected_Items_vod__c, CLM_ID_vod__c, Question_vod__c, Survey_Type_vod__c, Text_Entered_vod__c, + Toggle_Button_On_vod__c, Track_Element_Description_vod__c, Track_Element_Id_vod__c, Track_Element_Type_vod__c, + Usage_Duration_vod__c, Usage_Start_Time_vod__c, AuxillaryId_vod__c, ParentId_vod__c, Revision_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + SELECT + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit, + IsLocked, Answer_vod__c, Call_vod__c, Key_Message_vod__c, Mobile_ID_vod__c, Popup_Opened_vod__c, + Possible_Answers_vod__c, Presentation_ID_vod__c, Product_vod__c, Range_Value_vod__c, Rollover_Entered_vod__c, + Selected_Items_vod__c, CLM_ID_vod__c, Question_vod__c, Survey_Type_vod__c, Text_Entered_vod__c, + Toggle_Button_On_vod__c, Track_Element_Description_vod__c, Track_Element_Id_vod__c, Track_Element_Type_vod__c, + Usage_Duration_vod__c, Usage_Start_Time_vod__c, AuxillaryId_vod__c, ParentId_vod__c, Revision_vod__c, + medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + FROM + internal02.crm_Call_Clickstream_vod__c AS internaltb + WHERE + internaltb.Id = ? + ON DUPLICATE KEY UPDATE + Id = internaltb.Id, IsDeleted = internaltb.IsDeleted, Name = internaltb.Name, + CreatedDate = internaltb.CreatedDate, CreatedById = internaltb.CreatedById, + LastModifiedDate = internaltb.LastModifiedDate, LastModifiedById = internaltb.LastModifiedById, + SystemModstamp = internaltb.SystemModstamp, MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked, + Answer_vod__c = internaltb.Answer_vod__c, Call_vod__c = internaltb.Call_vod__c, + Key_Message_vod__c = internaltb.Key_Message_vod__c, Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c, + Popup_Opened_vod__c = internaltb.Popup_Opened_vod__c, Possible_Answers_vod__c = internaltb.Possible_Answers_vod__c, + Presentation_ID_vod__c = internaltb.Presentation_ID_vod__c, Product_vod__c = internaltb.Product_vod__c, + Range_Value_vod__c = internaltb.Range_Value_vod__c, Rollover_Entered_vod__c = internaltb.Rollover_Entered_vod__c, + Selected_Items_vod__c = internaltb.Selected_Items_vod__c, CLM_ID_vod__c = internaltb.CLM_ID_vod__c, + Question_vod__c = internaltb.Question_vod__c, Survey_Type_vod__c = internaltb.Survey_Type_vod__c, + Text_Entered_vod__c = internaltb.Text_Entered_vod__c, Toggle_Button_On_vod__c = internaltb.Toggle_Button_On_vod__c, + Track_Element_Description_vod__c = internaltb.Track_Element_Description_vod__c, + Track_Element_Id_vod__c = internaltb.Track_Element_Id_vod__c, Track_Element_Type_vod__c = internaltb.Track_Element_Type_vod__c, + Usage_Duration_vod__c = internaltb.Usage_Duration_vod__c, Usage_Start_Time_vod__c = internaltb.Usage_Start_Time_vod__c, + AuxillaryId_vod__c = internaltb.AuxillaryId_vod__c, ParentId_vod__c = internaltb.ParentId_vod__c, + Revision_vod__c = internaltb.Revision_vod__c, medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, + file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, + upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Call_Clickstream_vod__c', 'medaca_parent_record_type_id', target_column_value); + SET @temp_table_id = temp_table_id; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Product_Metrics_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Product_Metrics_vod__c.sql new file mode 100644 index 00000000..74281867 --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Product_Metrics_vod__c.sql @@ -0,0 +1,144 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- 当ストアドプロシージャは、同一セッション内での並列処理を実行することができない +-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している +CREATE PROCEDURE `internal02`.`crm_distribution_Product_Metrics_vod__c`() +SQL SECURITY INVOKER +BEGIN + +-- 振り分けスキーマ +DECLARE distribution_schema VARCHAR(20); +-- 振り分けカラム +DECLARE target_column_value VARCHAR(100); +-- 振り分け先テーブルID +DECLARE temp_table_id VARCHAR(18); +-- 振り分け先テーブルのSystemModstamp +DECLARE temp_system_modstamp DATETIME; +-- カーソルフェッチステータス +DECLARE fetch_done BOOLEAN DEFAULT FALSE; + +-- カーソル設定 +DECLARE table_cursor CURSOR FOR SELECT Id, SystemModstamp, medaca_parent_msj_product_classification__c FROM internal02.crm_Product_Metrics_vod__c; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +START TRANSACTION; + +-- UPSERT STATEMENT設定 +SET @upsert_statement_base = + 'INSERT INTO $$distribution_schema$$.crm_Product_Metrics_vod__c + (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Account_vod__c, Awareness__c, Selling_Stage__c, + Formulary_Status__c, Movement__c, Products_vod__c, Segment__c, X12_mo_trx_chg__c, Speaker_Skills__c, + Investigator_Readiness__c, Engagements__c, Mobile_ID_vod__c, External_ID_vod__c, MSJ_Patient__c, + Detail_Group_vod__c, MSJ_EB_1st_Line_Liver_Meta__c, MSJ_EB_1st_Line_Multi_Meta__c, MSJ_EB_2nd_Line_Mono__c, + MSJ_EB_2nd_Line_Combination__c, MSJ_EB_3rd_Line_Mono__c, MSJ_EB_3rd_Line_Combination__c, EMDS_Ability__c, + EMDS_Brand_Loyalty__c, EMDS_Decision_Maker__c, EMDS_Early_Tech_Adopter__c, EMDS_Influence__c, + EMDS_Main_Driver__c, EMDS_Priority__c, EMDS_Willingness__c, MSJ_KTL_Type__c, MSJ_KTL_Tier__c, + MSJ_Publications__c, MSJ_Clinical_Trials__c, MSJ_Speaker_for_Medical_Events__c, + MSJ_Advisor_to_Medical_Affairs__c, MSJ_Guidelines_Treatment_Standards__c, MSJ_Therapeutic_Area_Expertise__c, + MSJ_MAP_GAP__c, MSJ_Associations__c, MSJ_Tier_Score__c, MSJ_Primary_Medical_Focus__c, + MSJ_Secondary_Medical_Focus__c, MSJ_Tertiary_Medical_Focus__c, medaca_parent_msj_product_classification__c, + start_datetime, end_datetime, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + SELECT + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Account_vod__c, Awareness__c, Selling_Stage__c, + Formulary_Status__c, Movement__c, Products_vod__c, Segment__c, X12_mo_trx_chg__c, Speaker_Skills__c, + Investigator_Readiness__c, Engagements__c, Mobile_ID_vod__c, External_ID_vod__c, MSJ_Patient__c, + Detail_Group_vod__c, MSJ_EB_1st_Line_Liver_Meta__c, MSJ_EB_1st_Line_Multi_Meta__c, MSJ_EB_2nd_Line_Mono__c, + MSJ_EB_2nd_Line_Combination__c, MSJ_EB_3rd_Line_Mono__c, MSJ_EB_3rd_Line_Combination__c, EMDS_Ability__c, + EMDS_Brand_Loyalty__c, EMDS_Decision_Maker__c, EMDS_Early_Tech_Adopter__c, EMDS_Influence__c, + EMDS_Main_Driver__c, EMDS_Priority__c, EMDS_Willingness__c, MSJ_KTL_Type__c, MSJ_KTL_Tier__c, + MSJ_Publications__c, MSJ_Clinical_Trials__c, MSJ_Speaker_for_Medical_Events__c, + MSJ_Advisor_to_Medical_Affairs__c, MSJ_Guidelines_Treatment_Standards__c, MSJ_Therapeutic_Area_Expertise__c, + MSJ_MAP_GAP__c, MSJ_Associations__c, MSJ_Tier_Score__c, MSJ_Primary_Medical_Focus__c, + MSJ_Secondary_Medical_Focus__c, MSJ_Tertiary_Medical_Focus__c, medaca_parent_msj_product_classification__c, + start_datetime, end_datetime, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + FROM + internal02.crm_Product_Metrics_vod__c AS internaltb + WHERE + internaltb.Id = ? + AND internaltb.SystemModstamp = ? + ON DUPLICATE KEY UPDATE + IsDeleted = internaltb.IsDeleted, Name = internaltb.Name, CreatedDate = internaltb.CreatedDate, + CreatedById = internaltb.CreatedById, LastModifiedDate = internaltb.LastModifiedDate, + LastModifiedById = internaltb.LastModifiedById, + MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked, LastViewedDate = internaltb.LastViewedDate, + LastReferencedDate = internaltb.LastReferencedDate, Account_vod__c = internaltb.Account_vod__c, + Awareness__c = internaltb.Awareness__c, Selling_Stage__c = internaltb.Selling_Stage__c, + Formulary_Status__c = internaltb.Formulary_Status__c, Movement__c = internaltb.Movement__c, + Products_vod__c = internaltb.Products_vod__c, Segment__c = internaltb.Segment__c, + X12_mo_trx_chg__c = internaltb.X12_mo_trx_chg__c, Speaker_Skills__c = internaltb.Speaker_Skills__c, + Investigator_Readiness__c = internaltb.Investigator_Readiness__c, Engagements__c = internaltb.Engagements__c, + Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c, External_ID_vod__c = internaltb.External_ID_vod__c, + MSJ_Patient__c = internaltb.MSJ_Patient__c, Detail_Group_vod__c = internaltb.Detail_Group_vod__c, + MSJ_EB_1st_Line_Liver_Meta__c = internaltb.MSJ_EB_1st_Line_Liver_Meta__c, + MSJ_EB_1st_Line_Multi_Meta__c = internaltb.MSJ_EB_1st_Line_Multi_Meta__c, + MSJ_EB_2nd_Line_Mono__c = internaltb.MSJ_EB_2nd_Line_Mono__c, + MSJ_EB_2nd_Line_Combination__c = internaltb.MSJ_EB_2nd_Line_Combination__c, + MSJ_EB_3rd_Line_Mono__c = internaltb.MSJ_EB_3rd_Line_Mono__c, + MSJ_EB_3rd_Line_Combination__c = internaltb.MSJ_EB_3rd_Line_Combination__c, + EMDS_Ability__c = internaltb.EMDS_Ability__c, EMDS_Brand_Loyalty__c = internaltb.EMDS_Brand_Loyalty__c, + EMDS_Decision_Maker__c = internaltb.EMDS_Decision_Maker__c, + EMDS_Early_Tech_Adopter__c = internaltb.EMDS_Early_Tech_Adopter__c, + EMDS_Influence__c = internaltb.EMDS_Influence__c, EMDS_Main_Driver__c = internaltb.EMDS_Main_Driver__c, + EMDS_Priority__c = internaltb.EMDS_Priority__c, EMDS_Willingness__c = internaltb.EMDS_Willingness__c, + MSJ_KTL_Type__c = internaltb.MSJ_KTL_Type__c, MSJ_KTL_Tier__c = internaltb.MSJ_KTL_Tier__c, + MSJ_Publications__c = internaltb.MSJ_Publications__c, MSJ_Clinical_Trials__c = internaltb.MSJ_Clinical_Trials__c, + MSJ_Speaker_for_Medical_Events__c = internaltb.MSJ_Speaker_for_Medical_Events__c, + MSJ_Advisor_to_Medical_Affairs__c = internaltb.MSJ_Advisor_to_Medical_Affairs__c, + MSJ_Guidelines_Treatment_Standards__c = internaltb.MSJ_Guidelines_Treatment_Standards__c, + MSJ_Therapeutic_Area_Expertise__c = internaltb.MSJ_Therapeutic_Area_Expertise__c, + MSJ_MAP_GAP__c = internaltb.MSJ_MAP_GAP__c, MSJ_Associations__c = internaltb.MSJ_Associations__c, + MSJ_Tier_Score__c = internaltb.MSJ_Tier_Score__c, + MSJ_Primary_Medical_Focus__c = internaltb.MSJ_Primary_Medical_Focus__c, + MSJ_Secondary_Medical_Focus__c = internaltb.MSJ_Secondary_Medical_Focus__c, + MSJ_Tertiary_Medical_Focus__c = internaltb.MSJ_Secondary_Medical_Focus__c, + medaca_parent_msj_product_classification__c = internaltb.medaca_parent_msj_product_classification__c, + start_datetime = internaltb.start_datetime, end_datetime = internaltb.end_datetime, + file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, + upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, temp_system_modstamp, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + SET @distribution_schema = internal02.get_distribution_to_schema('crm_Product_Metrics_vod__c', 'medaca_parent_msj_product_classification__c', target_column_value); + SET @temp_table_id = temp_table_id; + SET @temp_system_modstamp = temp_system_modstamp; + + SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema); + + -- UPSERT実行 + PREPARE stmt FROM @upsert_statement; + EXECUTE stmt USING @temp_table_id, @temp_system_modstamp; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/crm_history.sql b/rds_mysql/stored_procedure/internal02/crm_history.sql similarity index 94% rename from rds_mysql/stored_procedure/crm_history.sql rename to rds_mysql/stored_procedure/internal02/crm_history.sql index cc94bbfb..156d61f7 100644 --- a/rds_mysql/stored_procedure/crm_history.sql +++ b/rds_mysql/stored_procedure/internal02/crm_history.sql @@ -2,7 +2,7 @@ -- $$から始まり$$で終わる文字は後からREPLACEする文字を示す独自ルール -- crm_historyストアドプロシージャは、同一セッション内での並列処理を実行することができない -- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している -CREATE PROCEDURE src02.crm_history(target_table VARCHAR(255), target_column VARCHAR(255)) +CREATE PROCEDURE internal02.crm_history(target_table VARCHAR(255), target_column VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- 例外処理 @@ -52,7 +52,7 @@ BEGIN CREATE TEMPORARY TABLE $$target_table$$_make_history_tmp SELECT Id - , MIN($$target_column$$) AS min_start_datetime + , MIN($$target_column$$) AS min_systemmodstamp , MAX(start_datetime) AS max_start_datetime FROM $$target_table$$ @@ -74,7 +74,7 @@ BEGIN UPDATE $$target_table$$ tt INNER JOIN $$target_table$$_make_history_tmp mht ON tt.Id = mht.Id - AND tt.start_datetime = mht.min_start_datetime + AND tt.$$target_column$$ = mht.min_systemmodstamp SET end_datetime = mht.max_start_datetime - INTERVAL 1 SECOND , upd_user = CURRENT_USER() diff --git a/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql b/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql new file mode 100644 index 00000000..60c51d7f --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql @@ -0,0 +1,66 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +CREATE FUNCTION internal02.`get_distribution_to_schema`(target_table VARCHAR(64), target_column VARCHAR(64), target_column_value VARCHAR(100)) +RETURNS VARCHAR(20) +DETERMINISTIC + +BEGIN + -- 返却値 + DECLARE ret VARCHAR(20) DEFAULT NULL; + -- other振分先蓄積スキーマ + DECLARE distribution_schema_other VARCHAR(20) DEFAULT NULL; + -- 振分判断項目値 + DECLARE value_from_column_value VARCHAR(100) DEFAULT NULL; + -- 振分先蓄積スキーマ + DECLARE value_to_schema VARCHAR(20) DEFAULT NULL; + + -- カーソルがデータセットの最後に達したか判定するための変数 + DECLARE done INT DEFAULT FALSE; + + -- カーソル + DECLARE cursor_crm_data_distribution_settings CURSOR FOR + SELECT `from_column_value`, `to_schema` + FROM internal02.`crm_data_distribution_settings` + WHERE `table_id` = target_table + AND `from_column_id` = target_column; + + -- カーソルがデータセットをフェッチしきった時の動作を制御 + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cursor_crm_data_distribution_settings; + + read_loop: LOOP + FETCH cursor_crm_data_distribution_settings INTO value_from_column_value, value_to_schema; + + -- カーソルの読み出しが完了していればループを抜ける + IF done THEN + LEAVE read_loop; + END IF; + + IF value_from_column_value = target_column_value THEN + SET ret = value_to_schema; + END IF; + + -- カーソルから読み出した行が'other'かを判断 + IF value_from_column_value = 'other' THEN + SET distribution_schema_other = value_to_schema; + END IF; + END LOOP; + + CLOSE cursor_crm_data_distribution_settings; + + -- 例外処理 + IF distribution_schema_other IS NULL THEN + SET @error_msg = 'データ振分設定テーブルにotherの設定がされていません。テーブルID: $$target_table$$, 振分判断項目ID: $$target_column$$'; + SET @error_msg = REPLACE(@error_msg, "$$target_table$$", target_table); + SET @error_msg = REPLACE(@error_msg, "$$target_column$$", target_column); + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = @error_msg; + END IF; + + IF ret IS NULL THEN + SET ret = distribution_schema_other; + END IF; + + RETURN ret; +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/medaca_common/convert_empty_to_null.sql b/rds_mysql/stored_procedure/medaca_common/convert_empty_to_null.sql new file mode 100644 index 00000000..539d9e30 --- /dev/null +++ b/rds_mysql/stored_procedure/medaca_common/convert_empty_to_null.sql @@ -0,0 +1,15 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- 空文字をNULLに変換する +-- 半角スペースを含む値はそのまま返却される +CREATE FUNCTION medaca_common.convert_empty_to_null(column_value TEXT) +RETURNS TEXT DETERMINISTIC +BEGIN + RETURN ( + CASE + WHEN column_value IS NULL THEN NULL + WHEN LENGTH(column_value) = 0 THEN NULL + ELSE column_value + END + ); +END +; diff --git a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql new file mode 100644 index 00000000..d87d633c --- /dev/null +++ b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql @@ -0,0 +1,29 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE medaca_common.put_error_log(schema_name VARCHAR(50), procedure_name VARCHAR(100), + procedure_args VARCHAR(255), message TEXT, error_code VARCHAR(50), + error_message VARCHAR(500)) +SQL SECURITY INVOKER +BEGIN + INSERT INTO + medaca_common.procedure_log ( + log_datetime, + log_level, + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ) + VALUES ( + NOW(6), + "ERROR", + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ); + +END diff --git a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql new file mode 100644 index 00000000..a2224cf1 --- /dev/null +++ b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql @@ -0,0 +1,28 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE medaca_common.put_info_log(schema_name VARCHAR(50), procedure_name VARCHAR(100), + procedure_args VARCHAR(255), message TEXT) +SQL SECURITY INVOKER +BEGIN + INSERT INTO + medaca_common.procedure_log ( + log_datetime, + log_level, + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ) + VALUES ( + NOW(6), + "INFO", + schema_name, + procedure_name, + procedure_args, + message, + NULL, + NULL + ); + +END diff --git a/rds_mysql/stored_procedure/src05/get_syor_date.sql b/rds_mysql/stored_procedure/src05/get_syor_date.sql new file mode 100644 index 00000000..1cc9fb30 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/get_syor_date.sql @@ -0,0 +1,8 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- 処理日取得(date型) +CREATE FUNCTION src05.get_syor_date() +RETURNS date DETERMINISTIC +BEGIN + RETURN (SELECT STR_TO_DATE(syor_date,'%Y%m%d') FROM src05.hdke_tbl); +END +; diff --git a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql new file mode 100644 index 00000000..eacd56e9 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql @@ -0,0 +1,108 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.hco_to_mdb_laundering(target_table VARCHAR(255)) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'hco_to_mdb_laundering'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'hco_to_mdb_launderingでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A① 開始'); + + TRUNCATE TABLE internal05.hco_cnv_mdb_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A① 終了'); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A② 開始'); + + INSERT INTO + internal05.hco_cnv_mdb_t ( + hco_vid_v, + mdb_cd, + form_inst_name_kana, + form_inst_name_kanji, + inst_addr, + prefc_cd, + delete_flg, + abolish_ymd, + start_date + ) + SELECT + mcmv.hco_vid_v, + mcmv.mdb_cd, + ci.form_inst_name_kana, + ci.form_inst_name_kanji, + ci.inst_addr, + ci.prefc_cd, + ci.delete_flg, + ci.abolish_ymd, + mcmv.start_date + FROM + src05.mdb_cnv_mst_v AS mcmv + INNER JOIN ( + SELECT + hco_vid_v,MAX(sub_num) AS sno + FROM + src05.mdb_cnv_mst_v + WHERE + rec_sts_kbn != '9' + AND src05.get_syor_date() >= START_DATE + GROUP BY hco_vid_v + ) AS mcmv2 + ON mcmv.hco_vid_v = mcmv2.hco_vid_v + AND mcmv.sub_num = mcmv2.sno + LEFT OUTER JOIN src05.com_inst AS ci + ON mcmv.mdb_cd = ci.dcf_dsf_inst_cd + AND ci.delete_flg = '0' + ; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A② 終了'); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A③ 開始'); + + SET @update_institution = " + UPDATE $$target_table$$ AS tt, internal05.hco_cnv_mdb_t AS hcmt + SET + tt.inst_cd = hcmt.mdb_cd, + tt.inst_name_kana = hcmt.form_inst_name_kana, + tt.inst_name = hcmt.form_inst_name_kanji, + tt.address = hcmt.inst_addr, + tt.pref_cd = hcmt.prefc_cd + WHERE + tt.v_inst_cd = hcmt.hco_vid_v + AND tt.inst_clas_cd = '1' + "; + SET @update_institution = REPLACE(@update_institution, "$$target_table$$", target_table); + PREPARE update_institution_stmt from @update_institution; + EXECUTE update_institution_stmt; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_A③ 終了'); + +END diff --git a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql new file mode 100644 index 00000000..39f6e431 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql @@ -0,0 +1,65 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.inst_merge_laundering(target_table VARCHAR(255)) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'inst_merge_laundering'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'inst_merge_launderingでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_B① 開始'); + + SET @update_institution = " + UPDATE ( + SELECT + dcf_dsf_inst_cd, + dup_opp_cd, + form_inst_name_kanji, + form_inst_name_kana, + inst_addr, + prefc_cd + FROM + internal05.inst_merge_t + ) AS imt, + $$target_table$$ AS tt + SET + tt.inst_cd = imt.dup_opp_cd, + tt.inst_name = imt.form_inst_name_kanji, + tt.inst_name_kana = imt.form_inst_name_kana, + tt.address = imt.inst_addr, + tt.pref_cd = imt.prefc_cd, + tt.dwh_upd_dt = SYSDATE() + WHERE + tt.inst_cd = imt.dcf_dsf_inst_cd + AND tt.inst_clas_cd = '1' + "; + SET @update_institution = REPLACE(@update_institution, "$$target_table$$", target_table); + PREPARE update_institution_stmt from @update_institution; + EXECUTE update_institution_stmt; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_B① 終了'); + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql new file mode 100644 index 00000000..b825ac53 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql @@ -0,0 +1,76 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.inst_merge_t_create() +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'inst_merge_t_create'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'inst_merge_t_createでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成① 開始' + ); + + TRUNCATE TABLE internal05.inst_merge_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成① 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 開始' + ); + + INSERT INTO + internal05.inst_merge_t ( + dcf_dsf_inst_cd, + dup_opp_cd, + form_inst_name_kanji, + form_inst_name_kana, + inst_addr, + prefc_cd + ) + SELECT + dim.dcf_inst_cd, + dim.dcf_inst_cd_new, + ci.form_inst_name_kanji, + ci.form_inst_name_kana, + ci.inst_addr, + ci.prefc_cd + FROM + src05.dcf_inst_merge AS dim + LEFT OUTER JOIN src05.com_inst AS ci + ON dim.dcf_inst_cd_new = ci.dcf_dsf_inst_cd + AND ci.delete_flg = '0' + WHERE + dim.muko_flg = '0' + AND dim.dcf_inst_cd_new IS NOT NULL + AND dim.enabled_flg = 'Y' + AND src05.to_date_yyyymm01(dim.tekiyo_month) <= src05.get_syor_date(); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 終了' + ); + +END diff --git a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql new file mode 100644 index 00000000..e32aface --- /dev/null +++ b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql @@ -0,0 +1,49 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.sales_lau_delete(target_table VARCHAR(255), laundering_period_year INT) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_delete'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table, + 'laundering_period_year', laundering_period_year); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'sales_lau_deleteでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)過去データ削除① 開始'); + + SET @delete_data = " + DELETE FROM + $$target_table$$ + WHERE + kjyo_ym < DATE_FORMAT((src05.get_syor_date() - INTERVAL ? YEAR), '%Y%m') + "; + SET @delete_data = REPLACE(@delete_data, "$$target_table$$", target_table); + PREPARE delete_data_stmt from @delete_data; + SET @interval_year = laundering_period_year; + EXECUTE delete_data_stmt USING @interval_year; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)過去データ削除① 終了'); + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql new file mode 100644 index 00000000..429f8a33 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -0,0 +1,478 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- extract_to_dateは、NEWDWH2021-1230の対応の結果、未使用の引数となっています +CREATE PROCEDURE src05.sales_lau_upsert(target_table VARCHAR(255), extract_from_date DATE, + extract_to_date DATE) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_upsert'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table, 'extract_from_date', + extract_from_date, 'extract_to_date', extract_to_date); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'sales_lau_upsertでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成① 開始' + ); + + TRUNCATE TABLE internal05.bu_prd_name_contrast_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成① 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成② 開始' + ); + + INSERT INTO + internal05.bu_prd_name_contrast_t ( + prd_cd, + bu_cd, + phm_itm_cd, + pp_start_date, + pp_end_date, + update_date, + bp_start_date, + bp_end_date + ) + SELECT + ppmv.prd_cd, + bpnc.bu_cd, + ppmv.phm_itm_cd, + ppmv.start_date AS pp_start_date, + ppmv.end_date AS pp_end_date, + bpnc.update_date AS update_date, + bpnc.start_date AS bp_start_date, + bpnc.end_date AS bp_end_date + FROM + src05.phm_prd_mst_v AS ppmv + LEFT OUTER JOIN src05.bu_prd_name_contrast AS bpnc + ON ppmv.phm_itm_cd = bpnc.phm_itm_cd + WHERE + ppmv.rec_sts_kbn != '9' + ; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成② 終了' + ); + + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成③ 開始' + ); + + TRUNCATE TABLE internal05.fcl_mst_v_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成③ 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成④ 開始' + ); + + INSERT INTO + internal05.fcl_mst_v_t + SELECT + fmv1.v_inst_cd, + fmv1.sub_num, + fmv1.start_date, + fmv1.end_date, + fmv1.closed_dt, + fmv1.fcl_name, + fmv1.fcl_kn_name, + fmv1.fcl_abb_name, + fmv1.fcl_abb_kn_name, + fmv1.mkr_cd, + fmv1.jsk_proc_kbn, + fmv1.fmt_addr, + fmv1.fmt_kn_addr, + fmv1.postal_cd, + fmv1.prft_cd, + fmv1.prft_name, + fmv1.city_name, + fmv1.addr_line_1, + fmv1.tel_num, + fmv1.admin_kbn, + fmv1.fcl_type, + fmv1.rec_sts_kbn, + fmv1.ins_dt, + fmv1.upd_dt, + fmv1.dwh_upd_dt + FROM + src05.fcl_mst_v AS fmv1 + INNER JOIN ( + SELECT + fmv.v_inst_cd, + MAX(fmv.sub_num) AS sno + FROM + src05.fcl_mst_v AS fmv + GROUP BY + fmv.v_inst_cd + ) AS fmv2 + ON fmv1.v_inst_cd = fmv2.v_inst_cd + AND fmv1.sub_num = fmv2.sno + WHERE + fmv1.rec_sts_kbn != '9' + ; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成④ 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑤ 開始' + ); + + SET @extract_from_datetime = CAST(extract_from_date AS DATETIME); + + SET @upsert_sales_launderning = " + INSERT INTO + $$target_table$$ ( + rec_whs_cd, + rec_whs_sub_cd, + rec_whs_org_cd, + rec_cust_cd, + rec_comm_cd, + rec_tran_kbn, + rev_hsdnymd_wrk, + rev_hsdnymd_srk, + rec_urag_num, + rec_qty, + rec_nonyu_price, + rec_nonyu_amt, + rec_comm_name, + rec_nonyu_fcl_name, + free_item, + rec_nonyu_fcl_addr, + rec_nonyu_fcl_post, + rec_nonyu_fcl_tel, + rec_bef_hsdn_ymd, + rec_bef_slip_num, + rec_ymd, + sale_data_cat, + slip_file_name, + slip_mgt_num, + row_num, + hsdn_ymd, + exec_dt, + v_tran_cd, + tran_kbn_name, + whs_org_cd, + v_whsorg_cd, + whs_org_name, + whs_org_kn, + v_whs_cd, + whs_name, + nonyu_fcl_cd, + inst_name, + inst_name_kana, + address, + comm_cd, + comm_name, + nonyu_qty, + nonyu_price, + nonyu_amt, + shikiri_price, + shikiri_amt, + nhi_price, + nhi_amt, + v_inst_cd, + inst_clas_cd, + bu_cd, + item_cd, + item_name, + item_english_name, + pref_cd, + whspos_err_kbn, + htdnymd_err_kbn, + prd_exis_kbn, + fcl_exis_kbn, + bef_hsdn_ymd, + bef_slip_num, + slip_org_kbn, + kjyo_ym, + tksnbk_kbn, + fcl_exec_kbn, + rec_sts_kbn, + ins_dt, + ins_usr, + dwh_upd_dt + ) + SELECT + s.rec_whs_cd, + s.rec_whs_sub_cd, + s.rec_whs_org_cd, + s.rec_cust_cd, + s.rec_comm_cd, + s.rec_tran_kbn, + s.rev_hsdnymd_wrk, + s.rev_hsdnymd_srk, + s.rec_urag_num, + s.rec_qty, + s.rec_nonyu_price, + s.rec_nonyu_amt, + s.rec_comm_name, + s.rec_nonyu_fcl_name, + s.free_item, + s.rec_nonyu_fcl_addr, + s.rec_nonyu_fcl_post, + s.rec_nonyu_fcl_tel, + s.rec_bef_hsdn_ymd, + s.rec_bef_slip_num, + s.rec_ymd, + s.sale_data_cat, + s.slip_file_name, + s.slip_mgt_num, + s.row_num, + s.hsdn_ymd, + s.exec_dt, + s.v_tran_cd, + s.tran_kbn_name, + s.whs_org_cd, + s.v_whsorg_cd, + s.whs_org_name, + s.whs_org_kn, + s.v_whs_cd, + s.whs_name, + s.nonyu_fcl_cd, + s.v_inst_name, + s.v_inst_kn, + s.v_inst_addr, + s.comm_cd, + s.comm_name, + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + -s.nonyu_qty + ELSE + s.nonyu_qty + END AS nonyu_qty, + s.nonyu_price, + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + -s.nonyu_amt + ELSE + s.nonyu_amt + END AS nonyu_amt, + s.shikiri_price, + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + -s.shikiri_amt + ELSE + s.shikiri_amt + END AS shikiri_amt, + s.nhi_price, + CASE + WHEN + (LEFT(s.v_tran_cd,1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + -s.nhi_amt + ELSE + s.nhi_amt + END AS nhi_amt, + s.v_inst_cd, + CASE + WHEN + (fmvt.fcl_type = 'A1' or fmvt.fcl_type = 'A0') THEN '3' + WHEN + fmvt.fcl_type BETWEEN '20' AND '29' THEN '2' + ELSE + '1' + END AS inst_clas_cd, + bpnct.bu_cd, + ppmv.mkr_cd, + ppmv.mkr_inf_1, + ppmv.mkr_inf_2, + CASE + WHEN + s.v_inst_cd LIKE '00%' + THEN + ci.prefc_cd + ELSE + fmvt.prft_cd + END AS pref_cd, + s.whspos_err_kbn, + s.htdnymd_err_kbn, + s.prd_exis_kbn, + s.fcl_exis_kbn, + s.bef_hsdn_ymd, + s.bef_slip_num, + s.slip_org_kbn, + s.kjyo_ym, + s.tksnbk_kbn, + s.fcl_exec_kbn, + s.rec_sts_kbn, + s.ins_dt, + s.ins_usr, + SYSDATE() + FROM ( + SELECT + ? AS extract_from_datetime + ) AS sub + INNER JOIN src05.sales AS s + ON s.dwh_upd_dt >= sub.extract_from_datetime + LEFT OUTER JOIN src05.phm_prd_mst_v AS ppmv + ON s.comm_cd = ppmv.prd_cd + AND STR_TO_DATE(s.hsdn_ymd,'%Y%m%d') BETWEEN ppmv.start_date AND ppmv.end_date + AND ppmv.rec_sts_kbn != '9' + LEFT OUTER JOIN internal05.fcl_mst_v_t AS fmvt + ON s.v_inst_cd = fmvt.v_inst_cd + LEFT OUTER JOIN internal05.bu_prd_name_contrast_t AS bpnct + ON s.comm_cd = bpnct.prd_cd + AND STR_TO_DATE(s.hsdn_ymd, '%Y%m%d') BETWEEN bpnct.pp_start_date AND bpnct.pp_end_date + AND STR_TO_DATE(s.hsdn_ymd, '%Y%m%d') BETWEEN bpnct.bp_start_date AND bpnct.bp_end_date + LEFT OUTER JOIN src05.com_inst AS ci + ON s.v_inst_cd = ci.dcf_dsf_inst_cd + WHERE + (s.rec_sts_kbn = '0' AND s.err_flg20 = 'M') + OR ( + s.rec_sts_kbn = '0' + AND s.err_flg20 != 'M' + AND s.v_tran_cd IN (110, 120, 210, 220) + AND ( + (s.fcl_exec_kbn NOT IN ('2', '5') AND (s.fcl_exec_kbn != '6' OR ppmv.prd_sale_kbn != 1)) + OR s.fcl_exec_kbn IS NULL + ) + ) + + ON DUPLICATE KEY UPDATE + rec_whs_cd = s.rec_whs_cd, + rec_whs_sub_cd = s.rec_whs_sub_cd, + rec_whs_org_cd = s.rec_whs_org_cd, + rec_cust_cd = s.rec_cust_cd, + rec_comm_cd = s.rec_comm_cd, + rec_tran_kbn = s.rec_tran_kbn, + rev_hsdnymd_wrk = s.rev_hsdnymd_wrk, + rev_hsdnymd_srk = s.rev_hsdnymd_srk, + rec_urag_num = s.rec_urag_num, + rec_qty = s.rec_qty, + rec_nonyu_price = s.rec_nonyu_price, + rec_nonyu_amt = s.rec_nonyu_amt, + rec_comm_name = s.rec_comm_name, + rec_nonyu_fcl_name = s.rec_nonyu_fcl_name, + free_item = s.free_item, + rec_nonyu_fcl_addr = s.rec_nonyu_fcl_addr, + rec_nonyu_fcl_post = s.rec_nonyu_fcl_post, + rec_nonyu_fcl_tel = s.rec_nonyu_fcl_tel, + rec_bef_hsdn_ymd = s.rec_bef_hsdn_ymd, + rec_bef_slip_num = s.rec_bef_slip_num, + rec_ymd = s.rec_ymd, + sale_data_cat = s.sale_data_cat, + slip_file_name = s.slip_file_name, + row_num = s.row_num, + hsdn_ymd = s.hsdn_ymd, + exec_dt = s.exec_dt, + v_tran_cd = s.v_tran_cd, + tran_kbn_name = s.tran_kbn_name, + whs_org_cd = s.whs_org_cd, + v_whsorg_cd = s.v_whsorg_cd, + whs_org_name = s.whs_org_name, + whs_org_kn = s.whs_org_kn, + v_whs_cd = s.v_whs_cd, + whs_name = s.whs_name, + nonyu_fcl_cd = s.nonyu_fcl_cd, + inst_name = s.v_inst_name, + inst_name_kana = s.v_inst_kn, + address = s.v_inst_addr, + comm_cd = s.comm_cd, + comm_name = s.comm_name, + nonyu_qty = VALUES(nonyu_qty), + nonyu_price = s.nonyu_price, + nonyu_amt = VALUES(nonyu_amt), + shikiri_price = s.shikiri_price, + shikiri_amt = VALUES(shikiri_amt), + nhi_price = s.nhi_price, + nhi_amt = VALUES(nhi_amt), + v_inst_cd = s.v_inst_cd, + inst_clas_cd = VALUES(inst_clas_cd), + bu_cd = bpnct.bu_cd, + item_cd = ppmv.mkr_cd, + item_name = ppmv.mkr_inf_1, + item_english_name = ppmv.mkr_inf_2, + pref_cd = VALUES(pref_cd), + whspos_err_kbn = s.whspos_err_kbn, + htdnymd_err_kbn = s.htdnymd_err_kbn, + prd_exis_kbn = s.prd_exis_kbn, + fcl_exis_kbn = s.fcl_exis_kbn, + bef_hsdn_ymd = s.bef_hsdn_ymd, + bef_slip_num = s.bef_slip_num, + slip_org_kbn = s.slip_org_kbn, + kjyo_ym = s.kjyo_ym, + tksnbk_kbn = s.tksnbk_kbn, + fcl_exec_kbn = s.fcl_exec_kbn, + rec_sts_kbn = s.rec_sts_kbn, + ins_dt = s.ins_dt, + ins_usr = s.ins_usr, + dwh_upd_dt = SYSDATE() + "; + SET @upsert_sales_launderning = REPLACE(@upsert_sales_launderning, "$$target_table$$", target_table); + PREPARE upsert_sales_launderning_stmt from @upsert_sales_launderning; + EXECUTE upsert_sales_launderning_stmt USING @extract_from_datetime; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑤ 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑥ 開始' + ); + + SET @update_institution_code = " + UPDATE ( + SELECT + ? AS extract_from_datetime + ) AS sub, + $$target_table$$ AS tt, + src05.sales AS s + SET + tt.inst_cd = ( + CASE + WHEN + (s.err_flg20 != 'M' AND tt.inst_clas_cd IN ('2', '3')) OR (s.err_flg20 = 'M') + THEN + s.v_inst_cd + ELSE + NULL + END + ) + WHERE + s.dwh_upd_dt >= sub.extract_from_datetime + AND tt.slip_mgt_num = s.slip_mgt_num + AND tt.row_num = s.row_num + "; + SET @update_institution_code = REPLACE(@update_institution_code, "$$target_table$$", target_table); + PREPARE update_institution_code_stmt from @update_institution_code; + EXECUTE update_institution_code_stmt USING @extract_from_datetime; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑥ 終了' + ); + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql b/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql new file mode 100644 index 00000000..e262291c --- /dev/null +++ b/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql @@ -0,0 +1,8 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- 年月を日付加工(date型) +CREATE FUNCTION src05.to_date_yyyymm01(yyyymm varchar(6)) +RETURNS date DETERMINISTIC +BEGIN + RETURN (STR_TO_DATE(CONCAT(yyyymm,'01'),'%Y%m%d')); +END +; diff --git a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql new file mode 100644 index 00000000..db50980a --- /dev/null +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -0,0 +1,79 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.v_inst_merge_laundering(target_table VARCHAR(255)) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'v_inst_merge_laundering'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'v_inst_merge_launderingでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】3:HCO施設コードの洗替① 開始' + ); + + SET @update_institution = " + UPDATE ( + SELECT + v_inst_cd, + v_inst_cd_merge, + fcl_name, + fcl_kn_name, + fmt_addr, + prft_cd + FROM + internal05.v_inst_merge_t + ) AS vimt, + $$target_table$$ AS tt + SET + tt.inst_cd = ( + CASE + WHEN + tt.inst_clas_cd = '1' + THEN + tt.inst_cd + WHEN + (tt.inst_clas_cd = '2' OR tt.inst_clas_cd = '3') + THEN + vimt.v_inst_cd_merge + END + ), + tt.v_inst_cd = vimt.v_inst_cd_merge, + tt.inst_name = vimt.fcl_name, + tt.inst_name_kana = vimt.fcl_kn_name, + tt.address = vimt.fmt_addr, + tt.pref_cd = vimt.prft_cd, + tt.dwh_upd_dt = SYSDATE() + WHERE + tt.v_inst_cd = vimt.v_inst_cd + AND (tt.inst_clas_cd IN ('1', '2', '3')) + "; + SET @update_institution = REPLACE(@update_institution, "$$target_table$$", target_table); + PREPARE update_institution_stmt from @update_institution; + EXECUTE update_institution_stmt; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】3:HCO施設コードの洗替① 終了' + ); + +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql new file mode 100644 index 00000000..1c75c4ea --- /dev/null +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql @@ -0,0 +1,82 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.v_inst_merge_t_create() +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'v_inst_merge_t_create'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'v_inst_merge_t_createでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'V施設統合マスタ(洗替処理一時テーブル)作成① 開始'); + + TRUNCATE TABLE internal05.v_inst_merge_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'V施設統合マスタ(洗替処理一時テーブル)作成① 終了'); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'V施設統合マスタ(洗替処理一時テーブル)作成② 開始'); + + INSERT INTO + internal05.v_inst_merge_t ( + v_inst_cd, + v_inst_cd_merge, + fcl_name, + fcl_kn_name, + fmt_addr, + prft_cd, + fcl_type + ) + SELECT + vhmv.v_inst_cd, + vhmv.v_inst_cd_merg, + fmv.fcl_name, + fmv.fcl_kn_name, + fmv.fmt_addr, + fmv.prft_cd, + fmv.fcl_type + FROM + src05.vop_hco_merge_v AS vhmv, + src05.fcl_mst_v AS fmv + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) AS max_sno_fmv + ON fmv.v_inst_cd = max_sno_fmv.v_inst_cd + AND fmv.sub_num = max_sno_fmv.sno + WHERE + vhmv.v_inst_cd_merg = fmv.v_inst_cd + AND STR_TO_DATE(vhmv.apply_dt, '%Y-%m-%d') <= src05.get_syor_date() + AND fmv.rec_sts_kbn != '9'; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 'V施設統合マスタ(洗替処理一時テーブル)作成② 終了' ); + +END diff --git a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql new file mode 100644 index 00000000..405f0621 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql @@ -0,0 +1,129 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.whs_org_laundering(target_table VARCHAR(255)) +SQL SECURITY INVOKER +BEGIN + -- スキーマ名 + DECLARE schema_name VARCHAR(50) DEFAULT (SELECT DATABASE()); + -- プロシージャ名 + DECLARE procedure_name VARCHAR(100) DEFAULT 'whs_org_laundering'; + -- プロシージャの引数 + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); + + -- 例外処理 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + CALL medaca_common.put_error_log(schema_name, procedure_name, procedure_args, + 'whs_org_launderingでエラーが発生', @error_state, @error_msg); + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替① 開始' + ); + + TRUNCATE TABLE internal05.whs_customer_org_t; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替① 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替② 開始' + ); + + SET SESSION optimizer_switch = 'derived_merge=off'; + INSERT INTO + internal05.whs_customer_org_t ( + whs_cd, + whs_sub_cd, + customer_cd, + whs_org_cd, + v_org_cd, + name_2 + ) + SELECT + wcmv.whs_cd, + wcmv.whs_sub_cd, + wcmv.customer_cd, + wcmv.whs_org_cd, + ocmv.v_org_cd, + mohv2.name_2 + FROM + src05.whs_customer_mst_v AS wcmv + LEFT OUTER JOIN src05.org_cnv_mst_v AS ocmv + ON wcmv.whs_cd = ocmv.whs_cd + AND wcmv.whs_sub_cd = ocmv.whs_sub_cd + AND wcmv.whs_org_cd = ocmv.org_cd + AND src05.get_syor_date() BETWEEN ocmv.start_date AND ocmv.end_date + AND ocmv.rec_sts_kbn != '9' + LEFT OUTER JOIN ( + SELECT + mohv.v_cd_2, + mohv.name_2 + FROM src05.mkr_org_horizon_v AS mohv + INNER JOIN ( + SELECT + v_cd_2, + MAX(dwh_upd_dt) AS dwh_upd_dt_latest + FROM + src05.mkr_org_horizon_v + WHERE + rec_sts_kbn != '9' + AND src05.get_syor_date() BETWEEN start_date AND end_date + GROUP BY + v_cd_2 + ORDER BY + MAX(start_date) DESC + ) AS m_latest + ON mohv.v_cd_2 = m_latest.v_cd_2 + AND mohv.dwh_upd_dt = m_latest.dwh_upd_dt_latest + WHERE + mohv.rec_sts_kbn != '9' + AND src05.get_syor_date() BETWEEN mohv.start_date AND mohv.end_date + ) AS mohv2 + ON ocmv.v_org_cd = mohv2.v_cd_2 + WHERE + wcmv.rec_sts_kbn != '9' + AND src05.get_syor_date() BETWEEN wcmv.start_date AND wcmv.end_date + ; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替② 終了' + ); + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替③ 開始' + ); + + SET @update_organization = " + UPDATE + $$target_table$$ AS tt, internal05.whs_customer_org_t AS wcot + SET + tt.whs_org_cd = wcot.whs_org_cd, + tt.v_whsorg_cd = wcot.v_org_cd, + tt.whs_org_name = wcot.name_2 + WHERE + wcot.whs_cd = tt.rec_whs_cd + AND wcot.whs_sub_cd = tt.rec_whs_sub_cd + AND wcot.customer_cd = tt.rec_cust_cd + "; + SET @update_organization = REPLACE(@update_organization, "$$target_table$$", target_table); + PREPARE update_organization_stmt from @update_organization; + EXECUTE update_organization_stmt; + + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替③ 終了' + ); + +END \ No newline at end of file diff --git a/s3/config/SAP/monthly_check_day_list.config b/s3/config/SAP/monthly_check_day_list.config index 5035c31e..91f0d0b0 100644 --- a/s3/config/SAP/monthly_check_day_list.config +++ b/s3/config/SAP/monthly_check_day_list.config @@ -1,12 +1,12 @@ -2023/01/03 -2023/02/03 -2023/03/03 -2023/04/03 -2023/05/03 -2023/06/03 -2023/07/03 -2023/08/03 -2023/09/03 -2023/10/03 -2023/11/07 -2023/12/03 \ No newline at end of file +2024/01/03 +2024/02/03 +2024/03/03 +2024/04/03 +2024/05/03 +2024/06/03 +2024/07/03 +2024/08/03 +2024/09/03 +2024/10/03 +2024/11/03 +2024/12/03 \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Clinical_Trial__c.json b/s3/config/crm/last_fetch_datetime/Clinical_Trial__c.json new file mode 100644 index 00000000..d7b52ba2 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Clinical_Trial__c.json @@ -0,0 +1,5 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} + \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Directory_vod__c.json b/s3/config/crm/last_fetch_datetime/Directory_vod__c.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Directory_vod__c.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/Event.json b/s3/config/crm/last_fetch_datetime/Event.json new file mode 100644 index 00000000..d1f26838 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Event.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/MSJ_Congresses__c.json b/s3/config/crm/last_fetch_datetime/MSJ_Congresses__c.json new file mode 100644 index 00000000..d7b52ba2 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/MSJ_Congresses__c.json @@ -0,0 +1,5 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} + \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/ProcessDefinition.json b/s3/config/crm/last_fetch_datetime/ProcessDefinition.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessDefinition.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstance.json b/s3/config/crm/last_fetch_datetime/ProcessInstance.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstance.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessNode.json b/s3/config/crm/last_fetch_datetime/ProcessNode.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessNode.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/Publication__c.json b/s3/config/crm/last_fetch_datetime/Publication__c.json new file mode 100644 index 00000000..d7b52ba2 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Publication__c.json @@ -0,0 +1,5 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} + \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Suggestion_Feedback_vod__c.json b/s3/config/crm/last_fetch_datetime/Suggestion_Feedback_vod__c.json new file mode 100644 index 00000000..d1f26838 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Suggestion_Feedback_vod__c.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Suggestion_Tag_vod__c.json b/s3/config/crm/last_fetch_datetime/Suggestion_Tag_vod__c.json new file mode 100644 index 00000000..d1f26838 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Suggestion_Tag_vod__c.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Suggestion_vod__c.json b/s3/config/crm/last_fetch_datetime/Suggestion_vod__c.json new file mode 100644 index 00000000..d1f26838 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Suggestion_vod__c.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} \ No newline at end of file diff --git a/s3/config/crm/last_fetch_datetime/Task.json b/s3/config/crm/last_fetch_datetime/Task.json new file mode 100644 index 00000000..d1f26838 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Task.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} \ No newline at end of file diff --git a/s3/config/crm/object_info/crm_object_list_all.json b/s3/config/crm/object_info/crm_object_list_all.json index cfd70934..b12b0a94 100644 --- a/s3/config/crm/object_info/crm_object_list_all.json +++ b/s3/config/crm/object_info/crm_object_list_all.json @@ -104,6 +104,65 @@ "datetime_column": "LastModifiedDate", "last_fetch_datetime_file_name": "AccountShare_ALL.json", "upload_file_name": "CRM_AccountShare_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessDefinition", + "columns": [ + "Id", + "Name", + "DeveloperName", + "Type", + "Description", + "TableEnumOrId", + "LockType", + "State", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessDefinition_ALL.json", + "upload_file_name": "CRM_ProcessDefinition_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessInstanceStep", + "columns": [ + "Id", + "ProcessInstanceId", + "StepStatus", + "OriginalActorId", + "ActorId", + "Comments", + "StepNodeId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessInstanceStep_ALL.json", + "upload_file_name": "CRM_ProcessInstanceStep_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessNode", + "columns": [ + "Id", + "Name", + "DeveloperName", + "ProcessDefinitionId", + "Description", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessNode_ALL.json", + "upload_file_name": "CRM_ProcessNode_ALL_{execute_datetime}" } ] } diff --git a/s3/config/crm/object_info/crm_object_list_diff.json b/s3/config/crm/object_info/crm_object_list_diff.json index db145744..e4b17fdd 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -37,7 +37,9 @@ "Display_Order_vod__c", "Clm_Presentation_Name_vod__c", "Clm_Presentation_Version_vod__c", - "Clm_Presentation_vod__c" + "Clm_Presentation_vod__c", + "Share_Channel_vod__c", + "Call2_vod__r.RecordTypeId" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -61,7 +63,8 @@ "Detail_Priority_vod__c", "Mobile_ID_vod__c", "Override_Lock_vod__c", - "Type_vod__c" + "Type_vod__c", + "Call2_vod__r.RecordTypeId" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -226,6 +229,7 @@ "MSJ_MSL_Comment_for_MR__c", "MSJ_APD__c", "Medical_Inquiry_vod__c", + "Suggestion_vod__c", "MSJ_Call_Type_MSJ__c", "MSJ_Prescription_Request__c", "MSJ_Patient_Follow__c", @@ -273,7 +277,11 @@ "MSJ_Interaction_Duration__c", "MSJ_SIPAGL_1A_date__c", "MSJ_CoPromotion__c", - "Call_Channel_Formula_vod__c" + "Call_Channel_Formula_vod__c", + "Meeting_Request_vod__c", + "Phone_vod__c", + "Detail_Section_Attribute_vod__c", + "Remote_Meeting_Type_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -401,11 +409,11 @@ "Description_vod__c", "Keywords_vod__c", "Content_Channel_vod__c", - "original_material_approved_in_veritas__c", - "keywords__c", - "trade_team__c", + "business_function__c", "ewizard_link__c", - "business_function__c" + "keywords__c", + "original_material_approved_in_veritas__c", + "trade_team__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -490,7 +498,19 @@ "MSJ_Level_4B_Value__c", "MSJ_Hospital_ID__c", "MSJ_Hospital_Name__c", - "MSJ_Hospital__c" + "MSJ_Hospital__c", + "MSJ_Approval_Status__c", + "MSJ_Description_J__c", + "MSJ_Disclaimer__c", + "MSJ_HighlightPanel_Display_J__c", + "MSJ_Insight_Owner_Sharing__c", + "MSJ_Level_1J__c", + "MSJ_Not_pharmacovigilance_related__c", + "MSJ_Starred_Insight__c", + "MSJ_Summary_J__c", + "MSJ_Therapeutic_Area__c", + "MSJ_Type_of_Insight__c", + "MSJ_Level_2J__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -532,7 +552,13 @@ "MSJ_Next_Week_Action_Who_MCC__c", "MSJ_Next_Week_Action_What_MCC__c", "MSJ_Next_Week_Action_When_MCC__c", - "MSJ_Target_Patient_Count_MCC__c" + "MSJ_Target_Patient_Count_MCC__c", + "MSJ_Activity_Results_Summary_LC__c", + "MSJ_Next_Week_Action_Where_LC__c", + "MSJ_Next_Week_Action_Who_LC__c", + "MSJ_Next_Week_Action_What_LC__c", + "MSJ_Next_Week_Action_When_LC__c", + "MSJ_Target_Patient_Count_LC__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -597,7 +623,11 @@ "Position_vod__c", "Talk_Title_vod__c", "MSJ_Attendee_Reaction__c", - "MSJ_Registration__c" + "MSJ_Registration__c", + "MSJ_DirectMail_Status__c", + "EM_Event_Team_Member_vod__c", + "Group_Name_vod__c", + "Role_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -664,11 +694,14 @@ "iOS_Resolution_vod__c", "approved_for_distribution_date__c", "approved_for_use_date__c", + "business_function__c", "ewizard_link__c", "expiration_date__c", "keywords__c", "trade_team__c", - "business_function__c" + "MSJ_Start_Date__c", + "MSJ_End_Date__c", + "MSJ_Strategic_Message__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -915,12 +948,12 @@ "MSJ_SK_10__c", "MSJ_Specific_Action__c", "MSJ_Training_Point__c", - "MSJ_Efforts_of_Year__c", - "MSJ_Efforts_of_Month__c", - "MSJ_Skill_Task__c", - "MSJ_Action_of_This_Month__c", "MSJ_Achievement_of_This_Month__c", - "MSJ_Comment_from_AM__c" + "MSJ_Action_of_This_Month__c", + "MSJ_Comment_from_AM__c", + "MSJ_Efforts_of_Month__c", + "MSJ_Efforts_of_Year__c", + "MSJ_Skill_Task__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -961,7 +994,8 @@ "Usage_Start_Time_vod__c", "AuxillaryId_vod__c", "ParentId_vod__c", - "Revision_vod__c" + "Revision_vod__c", + "Call_vod__r.RecordTypeId" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1012,7 +1046,8 @@ "EMDS_Materials__c", "EMDS_Topic__c", "MSJ_Visit_Purpose__c", - "MSJ_Insight_Count__c" + "MSJ_Insight_Count__c", + "Call2_vod__r.RecordTypeId" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1158,6 +1193,7 @@ "PermissionsEditPublicFilters", "PermissionsEditPublicTemplates", "PermissionsModifyAllData", + "PermissionsEditBillingInfo", "PermissionsManageCases", "PermissionsManageSolutions", "PermissionsCustomizeApplication", @@ -1203,6 +1239,7 @@ "PermissionsViewContent", "PermissionsManageEmailClientConfig", "PermissionsEnableNotifications", + "PermissionsIsSsoEnabled", "PermissionsManageDataIntegrations", "PermissionsDistributeFromPersWksp", "PermissionsViewDataCategories", @@ -1285,6 +1322,7 @@ "PermissionsManageSandboxes", "PermissionsAutomaticActivityCapture", "PermissionsImportCustomObjects", + "PermissionsSalesforceIQInbox", "PermissionsDelegatedTwoFactor", "PermissionsSelectFilesFromSalesforce", "PermissionsModerateNetworkUsers", @@ -1326,9 +1364,12 @@ "PermissionsApexRestServices", "PermissionsEnableCommunityAppLauncher", "PermissionsGiveRecognitionBadge", + "PermissionsAllowObjectDetection", + "PermissionsSalesforceIQInternal", "PermissionsUseMySearch", "PermissionsLtngPromoReserved01UserPerm", "PermissionsManageSubscriptions", + "PermissionsAllowObjectDetectionTraining", "PermissionsManageSurveys", "PermissionsUseAssistantDialog", "PermissionsUseQuerySuggestions", @@ -1358,6 +1399,7 @@ "PermissionsSkipIdentityConfirmation", "PermissionsSendCustomNotifications", "PermissionsPackaging2Delete", + "PermissionsViewRestrictionAndScopingRules", "PermissionsFSCComprehensiveUserAccess", "PermissionsManageTrustMeasures", "PermissionsViewTrustMeasures", @@ -1369,8 +1411,18 @@ "PermissionsManageExternalConnections", "PermissionsAIViewInsightObjects", "PermissionsAICreateInsightObjects", + "PermissionsViewMLModels", "PermissionsNativeWebviewScrolling", "PermissionsViewDeveloperName", + "PermissionsBypassMFAForUiLogins", + "PermissionsClientSecretRotation", + "PermissionsUpdateReportTypeReferences", + "PermissionsAccessToServiceProcess", + "PermissionsManageOrchInstsAndWorkItems", + "PermissionsCMSECEAuthoringAccess", + "PermissionsEnableIPFSUpload", + "PermissionsEnableBCTransactionPolling", + "PermissionsFSCArcGraphCommunityUser", "Type", "UserLicenseId", "UserType", @@ -1379,6 +1431,7 @@ "LastModifiedDate", "LastModifiedById", "SystemModstamp", + "IsSsoEnabled", "Description", "LastViewedDate", "LastReferencedDate" @@ -1454,7 +1507,15 @@ "MSJ_Sent_Date__c", "MSJ_Email_Subject__c", "MSJ_Opens__c", - "MSJ_Email_Status__c" + "MSJ_Email_Status__c", + "MSJ_Activity_Name__c", + "MSJ_Asset__c", + "MSJ_CIAM_Account__c", + "MSJ_Channel__c", + "MSJ_Content__c", + "MSJ_Registration_Time__c", + "MSJ_Related_External_Account_Data__c", + "MSJ_Tag_Id__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1583,7 +1644,9 @@ "MSJ_MSL_Support__c", "MSJ_Material_Requirement__c", "MSJ_Hospital_Name_Disp__c", - "MSJ_Hospital__c" + "MSJ_Hospital__c", + "MSJ_Chatbot_Check__c", + "MSJ_File_Attached__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1728,8 +1791,7 @@ "UserPreferencesShowStateToGuestUsers", "UserPreferencesShowPostalCodeToGuestUsers", "UserPreferencesShowCountryToGuestUsers", - "UserPreferencesHideInvoicesRedirectConfirmation", - "UserPreferencesHideStatementsRedirectConfirmation", + "UserPreferencesShowForecastingChangeSignals", "UserPreferencesPathAssistantCollapsed", "UserPreferencesCacheDiagnostics", "UserPreferencesShowEmailToGuestUsers", @@ -1760,6 +1822,9 @@ "UserPreferencesSRHOverrideActivities", "UserPreferencesNewLightningReportRunPageEnabled", "UserPreferencesReverseOpenActivitiesView", + "UserPreferencesHasSentWarningEmail", + "UserPreferencesHasSentWarningEmail238", + "UserPreferencesHasSentWarningEmail240", "UserPreferencesHideBrowseProductRedirectConfirmation", "UserPreferencesHideOnlineSalesAppWelcomeMat", "ContactId", @@ -1833,7 +1898,23 @@ "Last_CRMDesktop_Mac_Version_vod__c", "Last_CRMDesktop_Windows_Sync_vod__c", "Last_CRMDesktop_Windows_Version_vod__c", - "MSJ_Test_User__c" + "MSJ_Test_User__c", + "Last_Android_Connect_Version_vod__c", + "Last_Android_Connect_vod__c", + "Last_Android_OS_Version_vod__c", + "Last_Android_Sync_vod__c", + "Last_CRMDesktop_Mac_Conn_Ver_vod__c", + "Last_CRMDesktop_Mac_Connect_vod__c", + "Last_CRMDesktop_Windows_Conn_Ver_vod__c", + "Last_CRMDesktop_Windows_Connect_vod__c", + "MS_Graph_API_Authorized_vod__c", + "MS_Outlook_Last_Pull_Activity_vod__c", + "MS_Outlook_Last_Push_Activity_vod__c", + "Enable_MS_Outlook_Calendar_vod__c", + "Last_iPad_Updates_Applied_vod__c", + "Last_iPhone_Updates_Applied_vod__c", + "UserPreferencesHideInvoicesRedirectConfirmation", + "UserPreferencesHideStatementsRedirectConfirmation" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2171,6 +2252,24 @@ "MSJ_Marketing_Cloud4__c", "MSJ_Medical_Department__c", "MSJ_Marketing_Cloud0__c", + "MSJ_CIAM_Number__c", + "MSJ_sID__c", + "MSJ_Application_Materials_Deadline__c", + "MSJ_DI_Person__c", + "MSJ_Pharmaceutical_Department_Memo__c", + "MSJ_Pharmaceutical_Examination_Date__c", + "MSJ_Pharmaceutical_Examination_Member__c", + "MSJ_Pharmaceutical_Examination_Rule_Memo__c", + "MSJ_Pharmaceutical_Examination_Rule__c", + "MSJ_Pharmacy_Director__c", + "MSJ_Visit_Regulation__c", + "MSJ_18_Digit_Salesforce_Id__c", + "MSJ_Clinical_Trial_Count__c", + "MSJ_Congresses_Count__c", + "MSJ_Deletion_H1__c", + "MSJ_External_Link_To_Full_H1_Profile__c", + "MSJ_Industry_Payments_Amount__c", + "MSJ_Publication_Count__c", "Mobile_ID_vod__pc", "H1Insights__H1_NPI_Value_for_Testing__pc", "H1Insights__H1_Person_ID__pc", @@ -2308,7 +2407,8 @@ "zvod_Consent_Line_vod__c", "zvod_Signature_Capture_vod__c", "Double_Opt_In_vod__c", - "zvod_Consent_Activity_Tracking_vod__c" + "zvod_Consent_Activity_Tracking_vod__c", + "MSJ_Channel_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2423,7 +2523,12 @@ "MSJ_MSL_Support__c", "MSJ_Handover_Comment__c", "MSJ_Handover_Email__c", - "MSJ_Material_Requirement__c" + "MSJ_Material_Requirement__c", + "MSJ_Material_Used__c", + "MSJ_File_Attached__c", + "MSJ_Off_Label__c", + "MSJ_Include_Quality_Complaint__c", + "MSJ_PSC__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2483,7 +2588,8 @@ "Bcc_vod__c", "Audience_vod__c", "WeChat_Template_ID_vod__c", - "Check_Consent_vod__c" + "Check_Consent_vod__c", + "Publish_Method_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2547,7 +2653,9 @@ "MSJ_Target_Call_Num__c", "MSJ_Tech_segment__c", "MSJ_Title__c", - "MSJ_XLK_Segment__c" + "MSJ_XLK_Segment__c", + "MSJ_Main_Treatment_Plan__c", + "MSJ_Optimal_Visiting_Hours__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2640,7 +2748,22 @@ "MSJ_Child_Account_Name__c", "MSJ_Child_Account__c", "MSJ_Parent_Account_Name__c", - "MSJ_Parent_Child_Name__c" + "MSJ_Parent_Child_Name__c", + "MSJ_Age__c", + "MSJ_Comments__c", + "MSJ_Effectiveness_evaluation_date__c", + "MSJ_Gender__c", + "MSJ_Informed_consent__c", + "MSJ_Metastases_location__c", + "MSJ_PS__c", + "MSJ_Scheduled_date_of_informed_consent__c", + "MSJ_Scheduled_start_date_administration__c", + "MSJ_CDX_type__c", + "MSJ_First_line_chemotherapy_efficacy__c", + "MSJ_Num_cycles_of_1st_line_chemotherapy__c", + "MSJ_Primary_site_location__c", + "MSJ_Regimen_of_first_line_chemotherapy__c", + "MSJ_Starting_dose__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2700,7 +2823,8 @@ "MSJ_Global_Brand__c", "MSJ_Global_Business_Unit__c", "MSJ_Molecules__c", - "MSJ_SBU__c" + "MSJ_SBU__c", + "MSJ_Local_Business_Unit__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2783,7 +2907,11 @@ "MSJ_Therapeutic_Area_Expertise__c", "MSJ_MAP_GAP__c", "MSJ_Associations__c", - "MSJ_Tier_Score__c" + "MSJ_Tier_Score__c", + "MSJ_Primary_Medical_Focus__c", + "MSJ_Secondary_Medical_Focus__c", + "MSJ_Tertiary_Medical_Focus__c", + "Products_vod__r.MSJ_Product_Classification__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2870,6 +2998,7 @@ "zvod_Specialty_vod__c", "Score_vod__c", "User_vod__c", + "Suggestion_vod__c", "Child_Account_vod__c", "Location_Entity_Reference_Id_vod__c", "Location_vod__c", @@ -2998,10 +3127,481 @@ "Activity_Tracking_Mode_vod__c", "Email_Source_vod__c", "Subject_vod__c", - "User_Input_Text_vod__c" + "User_Input_Text_vod__c", + "Email_Group_Id_vod__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Suggestion_vod__c", + "columns": [ + "Id", + "OwnerId", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Account_Priority_Score_vod__c", + "Account_vod__c", + "Action_Count_vod__c", + "Actioned_vod__c", + "Call_Objective_CLM_ID_vod__c", + "Call_Objective_From_Date_vod__c", + "Call_Objective_On_By_Default_vod__c", + "Call_Objective_Record_Type_vod__c", + "Call_Objective_To_Date_vod__c", + "Dismiss_Count_vod__c", + "Dismissed_vod__c", + "Display_Dismiss_vod__c", + "Display_Mark_As_Complete_vod__c", + "Display_Score_vod__c", + "Email_Template_ID_vod__c", + "Email_Template_Vault_ID_vod__c", + "Email_Template_vod__c", + "Expiration_Date_vod__c", + "Mark_Complete_Count_vod__c", + "Marked_As_Complete_vod__c", + "No_Homepage_vod__c", + "Planned_Call_Date_vod__c", + "Posted_Date_vod__c", + "Priority_vod__c", + "Reason_vod__c", + "Record_Type_Name_vod__c", + "Suggestion_External_Id_vod__c", + "Suppress_Reason_vod__c", + "Title_vod__c", + "Suggestion_Survey_vod__c", + "Category_vod__c", + "MSJ_Data_Id__c", + "MSJ_Reason_unformatted__c", + "MSJ_reason_id__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Suggestion_Tag_vod__c", + "columns": [ + "Id", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "Suggestion_vod__c", + "Detail_Group_vod__c", + "Driver_vod__c", + "Email_Fragment_order_vod__c", + "Email_Fragment_vod__c", + "External_ID_vod__c", + "Product_vod__c", + "Record_Type_Name_vod__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Suggestion_Feedback_vod__c", + "columns": [ + "Id", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "Suggestion_vod__c", + "Account_vod__c", + "Activity_Execution_Type_vod__c", + "Call2_vod__c", + "Call_Objective_vod__c", + "DismissFeedback1_vod__c", + "DismissFeedback2_vod__c", + "DismissFeedback3_vod__c", + "DismissFeedback4_vod__c", + "Mobile_ID_vod__c", + "Sent_Email_vod__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Event", + "columns": [ + "Id", + "RecordTypeId", + "WhoId", + "WhatId", + "Subject", + "Location", + "IsAllDayEvent", + "ActivityDateTime", + "ActivityDate", + "DurationInMinutes", + "StartDateTime", + "EndDateTime", + "EndDate", + "Description", + "AccountId", + "OwnerId", + "IsPrivate", + "ShowAs", + "IsDeleted", + "IsChild", + "IsGroupEvent", + "GroupEventType", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "IsArchived", + "RecurrenceActivityId", + "IsRecurrence", + "RecurrenceStartDateTime", + "RecurrenceEndDateOnly", + "RecurrenceTimeZoneSidKey", + "RecurrenceType", + "RecurrenceInterval", + "RecurrenceDayOfWeekMask", + "RecurrenceDayOfMonth", + "RecurrenceInstance", + "RecurrenceMonthOfYear", + "ReminderDateTime", + "IsReminderSet", + "EventSubtype", + "IsRecurrence2Exclusion", + "Recurrence2PatternText", + "Recurrence2PatternVersion", + "IsRecurrence2", + "IsRecurrence2Exception", + "Recurrence2PatternStartDate", + "Recurrence2PatternTimeZone", + "Override_Lock_vod__c", + "Mobile_ID_vod__c", + "Color_vod__c", + "Event_Canceled_vod__c", + "MSJ_Data_ID__c", + "MSJ_Reason_ID__c", + "MSJ_Task_External_Id__c", + "MSJ_Task_Source__c", + "Followup_Activity_Type_vod__c", + "MSJ_Visit_Type__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Task", + "columns": [ + "Id", + "RecordTypeId", + "WhoId", + "WhatId", + "Subject", + "ActivityDate", + "Status", + "Priority", + "IsHighPriority", + "OwnerId", + "Description", + "IsDeleted", + "AccountId", + "IsClosed", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "IsArchived", + "CallDurationInSeconds", + "CallType", + "CallDisposition", + "CallObject", + "ReminderDateTime", + "IsReminderSet", + "RecurrenceActivityId", + "IsRecurrence", + "RecurrenceStartDateOnly", + "RecurrenceEndDateOnly", + "RecurrenceTimeZoneSidKey", + "RecurrenceType", + "RecurrenceInterval", + "RecurrenceDayOfWeekMask", + "RecurrenceDayOfMonth", + "RecurrenceInstance", + "RecurrenceMonthOfYear", + "RecurrenceRegeneratedType", + "TaskSubtype", + "CompletedDateTime", + "Override_Lock_vod__c", + "Mobile_ID_vod__c", + "Color_vod__c", + "Event_Canceled_vod__c", + "MSJ_Data_ID__c", + "MSJ_Reason_ID__c", + "MSJ_Task_External_Id__c", + "MSJ_Task_Source__c", + "Followup_Activity_Type_vod__c", + "MSJ_Visit_Type__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "MSJ_Congresses__c", + "columns": [ + "Id", + "OwnerId", + "IsDeleted", + "Name", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "MSJ_Account__c", + "MSJ_Conference_Name__c", + "MSJ_Date_Presented__c", + "MSJ_End_Date__c", + "MSJ_External_ID__c", + "MSJ_Link_to_Section_on_H1_Profile__c", + "MSJ_Organizer__c", + "MSJ_Session_Poster_Title__c", + "MSJ_Session_Poster__c", + "MSJ_Start_Date__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Publication__c", + "columns": [ + "Id", + "IsDeleted", + "Name", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Date__c", + "Title__c", + "Account__c", + "Journal__c", + "External_ID_vod__c", + "Journal_vod__c", + "PubMed_ID_Name_vod__c", + "PubMed_URL_vod__c", + "Publication_Type_vod__c", + "MSJ_Authors__c", + "MSJ_External_ID__c", + "MSJ_Full_Publication_Title__c", + "MSJ_Journal__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Clinical_Trial__c", + "columns": [ + "Id", + "IsDeleted", + "Name", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Date__c", + "Description__c", + "Phase__c", + "Role__c", + "Status__c", + "Sponsor__c", + "Account__c", + "End_Date_vod__c", + "External_ID_vod__c", + "ID_vod__c", + "Start_Date_vod__c", + "MSJ_Clinical_Trial_Full_Title__c", + "MSJ_External_ID__c", + "MSJ_Inclusion_Criteria__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessDefinition", + "columns": [ + "Id", + "Name", + "DeveloperName", + "Type", + "Description", + "TableEnumOrId", + "LockType", + "State", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstance", + "columns": [ + "Id", + "ProcessDefinitionId", + "TargetObjectId", + "Status", + "CompletedDate", + "LastActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "SubmittedById", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceStep", + "columns": [ + "Id", + "ProcessInstanceId", + "StepStatus", + "OriginalActorId", + "ActorId", + "Comments", + "StepNodeId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceNode", + "columns": [ + "Id", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "ProcessInstanceId", + "ProcessNodeId", + "NodeStatus", + "CompletedDate", + "LastActorId", + "ProcessNodeName", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessNode", + "columns": [ + "Id", + "Name", + "DeveloperName", + "ProcessDefinitionId", + "Description", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceWorkitem", + "columns": [ + "Id", + "ProcessInstanceId", + "OriginalActorId", + "ActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "IsDeleted", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Directory_vod__c", + "columns": [ + "Id", + "OwnerId", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Display_Order_vod__c", + "External_ID_vod__c", + "Level_vod__c", + "Parent_Directory_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true } ] -} \ No newline at end of file +} diff --git a/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config new file mode 100644 index 00000000..9cf79023 --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config @@ -0,0 +1,9 @@ +宛先各位 + Encise {receive_timing}である以下のファイルを受領できておりません。 +{notice_file_names} + + + QlikSenseサーバー側の送信状況のご確認をお願いいたします。 + + 尚、本メールはシステム自動送信のため、返信は出来ません。 + 本件に関する問い合わせは、MeDaCA Enciseデータ担当者にお願いいたします。 diff --git a/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config new file mode 100644 index 00000000..d40c304d --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config @@ -0,0 +1 @@ +【MeDaCa連携エラー通知】Encise {receive_timing}ファイル未受領 \ No newline at end of file diff --git a/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config new file mode 100644 index 00000000..591d85cb --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config @@ -0,0 +1,9 @@ +宛先各位 + Encise {receive_timing}である以下のファイルを受領できておりません。 +{notice_file_names} + + + Encise社へ送信状況のご確認をお願いいたします。 + + 尚、本メールはシステム自動送信のため、返信は出来ません。 + 本件に関する問い合わせは、MeDaCA Enciseデータ担当者にお願いいたします。 diff --git a/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config new file mode 100644 index 00000000..d40c304d --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config @@ -0,0 +1 @@ +【MeDaCa連携エラー通知】Encise {receive_timing}ファイル未受領 \ No newline at end of file diff --git a/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config b/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config new file mode 100644 index 00000000..44631a3a --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config @@ -0,0 +1,3 @@ +CLUFD_Merck02_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck02 +CLUFD_Merck03_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck03 +CLUFD_Merck04_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck04 diff --git a/s3/config/encise/unreceive_check_target/en_cluster_file_list.config b/s3/config/encise/unreceive_check_target/en_cluster_file_list.config new file mode 100644 index 00000000..33c31f6f --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_cluster_file_list.config @@ -0,0 +1,6 @@ +CLUFD_Merck02_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck02 +CLUFD_Merck03_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck03 +CLUFD_Merck04_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck04 +CLUFM_CLUMST_496_01_([0-9]{6})\.(CSV|csv) En-Cluster クラスタマスタ +CLUFM_PROADD_496_([0-9]{6})\.(CSV|csv) En-Cluster 製品定義ファイル +CLUFM_PROLST_496_([0-9]{6})\.(CSV|csv) En-Cluster 製品マスタ diff --git a/s3/config/encise/unreceive_check_target/en_fixed_file_list.config b/s3/config/encise/unreceive_check_target/en_fixed_file_list.config new file mode 100644 index 00000000..edd0126b --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_fixed_file_list.config @@ -0,0 +1,11 @@ +NATFD_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation データ +NATFM_PROADD_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation 製品定義ファイル +NATFM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation セグメントマスタ +MST_BRAND([0-9]{6})\.(CSV|csv) 確定版 En-Nation ブランドマスタ +CITFD_Merck01_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck01 +CITFD_Merck06_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck06 +CITFD_Merck07_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck07 +CITFM_PROADD_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 製品定義ファイル +CITFM_PROLST_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 製品マスタ +CITFM_REGION_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 地域マスタ +CITFM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 確定版 En-City セグメントマスタ diff --git a/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config b/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config new file mode 100644 index 00000000..dfb557e8 --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config @@ -0,0 +1 @@ +NATFD_496_([0-9]{6})D\.(CSV|csv) 確定版 En-Nation データ 直販分 \ No newline at end of file diff --git a/s3/config/encise/unreceive_check_target/en_quick_file_list.config b/s3/config/encise/unreceive_check_target/en_quick_file_list.config new file mode 100644 index 00000000..e3f3ebcd --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_quick_file_list.config @@ -0,0 +1,10 @@ +NATQD_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation データ +NATQM_PROADD_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation 製品定義ファイル +NATQM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation セグメントマスタ +CITQD_Merck01_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck01 +CITQD_Merck06_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck06 +CITQD_Merck07_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck07 +CITQM_PROADD_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 製品定義ファイル +CITQM_PROLST_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 製品マスタ +CITQM_REGION_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 地域マスタ +CITQM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 速報版 En-City セグメントマスタ diff --git a/s3/config/jskult/calendar/jskult_holiday_list.txt b/s3/config/jskult/calendar/jskult_holiday_list.txt new file mode 100644 index 00000000..7b3d83be --- /dev/null +++ b/s3/config/jskult/calendar/jskult_holiday_list.txt @@ -0,0 +1,133 @@ +2023/12/02 +2023/12/03 +2023/12/09 +2023/12/10 +2023/12/16 +2023/12/17 +2023/12/23 +2023/12/24 +2023/12/29 +2023/12/30 +2023/12/31 +2024/01/01 +2024/01/02 +2024/01/03 +2024/01/06 +2024/01/07 +2024/01/08 +2024/01/13 +2024/01/14 +2024/01/20 +2024/01/21 +2024/01/27 +2024/01/28 +2024/02/03 +2024/02/04 +2024/02/10 +2024/02/11 +2024/02/12 +2024/02/17 +2024/02/18 +2024/02/23 +2024/02/24 +2024/02/25 +2024/03/02 +2024/03/03 +2024/03/09 +2024/03/10 +2024/03/16 +2024/03/17 +2024/03/20 +2024/03/23 +2024/03/24 +2024/03/30 +2024/03/31 +2024/04/06 +2024/04/07 +2024/04/13 +2024/04/14 +2024/04/20 +2024/04/21 +2024/04/27 +2024/04/28 +2024/04/29 +2024/05/03 +2024/05/04 +2024/05/05 +2024/05/06 +2024/05/11 +2024/05/12 +2024/05/18 +2024/05/19 +2024/05/25 +2024/05/26 +2024/06/01 +2024/06/02 +2024/06/08 +2024/06/09 +2024/06/15 +2024/06/16 +2024/06/22 +2024/06/23 +2024/06/29 +2024/06/30 +2024/07/06 +2024/07/07 +2024/07/13 +2024/07/14 +2024/07/15 +2024/07/20 +2024/07/21 +2024/07/27 +2024/07/28 +2024/08/03 +2024/08/04 +2024/08/10 +2024/08/11 +2024/08/12 +2024/08/17 +2024/08/18 +2024/08/24 +2024/08/25 +2024/08/31 +2024/09/01 +2024/09/07 +2024/09/08 +2024/09/14 +2024/09/15 +2024/09/16 +2024/09/21 +2024/09/22 +2024/09/23 +2024/09/28 +2024/09/29 +2024/10/05 +2024/10/06 +2024/10/12 +2024/10/13 +2024/10/14 +2024/10/19 +2024/10/20 +2024/10/26 +2024/10/27 +2024/11/02 +2024/11/03 +2024/11/04 +2024/11/09 +2024/11/10 +2024/11/16 +2024/11/17 +2024/11/23 +2024/11/24 +2024/11/30 +2024/12/01 +2024/12/07 +2024/12/08 +2024/12/14 +2024/12/15 +2024/12/21 +2024/12/22 +2024/12/28 +2024/12/29 +2024/12/30 +2024/12/31 \ No newline at end of file diff --git a/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt b/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt new file mode 100644 index 00000000..10cd6d58 --- /dev/null +++ b/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt @@ -0,0 +1,13 @@ +2023/12/14 +2024/01/18 +2024/02/15 +2024/03/14 +2024/04/12 +2024/05/16 +2024/06/14 +2024/07/12 +2024/08/15 +2024/09/13 +2024/10/15 +2024/11/15 +2024/12/13 diff --git a/s3/config/jskult/convert/ultmarc_hex_convert_config.json b/s3/config/jskult/convert/ultmarc_hex_convert_config.json new file mode 100644 index 00000000..e29440e3 --- /dev/null +++ b/s3/config/jskult/convert/ultmarc_hex_convert_config.json @@ -0,0 +1,217 @@ +{ + "F9EB": "8782", + "F9E1": "8754", + "F9E0": "8755", + "F9DF": "8756", + "F9DE": "8757", + "F9DD": "8758", + "F9DC": "8759", + "F9DB": "875A", + "F6E1": "875B", + "F6E0": "875C", + "F6DF": "875D", + "F9DA": "FA41", + "F9E9": "878A", + "F9E8": "878B", + "F9E2": "878C", + "F9D7": "FA69", + "F9D5": "FA6C", + "F9D1": "FA6E", + "F9CF": "FA70", + "F6D3": "FA6F", + "F9CC": "FA72", + "F9CE": "FA71", + "F9C8": "FA75", + "F7B1": "FA74", + "F9C7": "FA78", + "F9C4": "FA7E", + "F9FA": "FA81", + "F860": "FA84", + "F9BE": "FA86", + "F783": "FA88", + "F9BA": "FA8B", + "F892": "FA8D", + "F9B9": "FA8E", + "F9B6": "FA92", + "F9B5": "FA93", + "F9B4": "FA95", + "F9AE": "FA9A", + "F7B9": "FA99", + "F881": "FA9D", + "F9A7": "FAA1", + "F9A6": "FAA2", + "F9A5": "FAA4", + "F9A3": "FAA6", + "F9A1": "FAAA", + "F99E": "FAAB", + "F89A": "FAAD", + "F99D": "FAAF", + "F99A": "FAB2", + "F999": "FAB0", + "F7A1": "FAB4", + "F869": "FA67", + "F992": "FAB9", + "F991": "FABA", + "F990": "FABB", + "F98E": "FABE", + "F85C": "FAC0", + "F98D": "FAC5", + "F98C": "FAC4", + "F989": "FAC8", + "F987": "FAC9", + "F986": "FACA", + "F789": "FACE", + "F859": "FAD1", + "F980": "FACF", + "F97D": "FAD4", + "F97E": "FA63", + "F97A": "FAD7", + "F858": "FAD5", + "F977": "FAD9", + "F976": "FADB", + "F975": "FADC", + "F857": "FADD", + "F86F": "FADE", + "F97C": "FA66", + "F971": "FAE1", + "F96E": "FAE2", + "F96F": "FAE5", + "F870": "FAE6", + "F96D": "FAE3", + "F96A": "FA64", + "F6AC": "FAE7", + "F969": "FAE9", + "F7D9": "FAF0", + "F966": "FAF1", + "F7DC": "FAF3", + "F965": "FAF5", + "F964": "FAF6", + "F880": "FAF9", + "F95E": "FAFB", + "F95C": "FB42", + "F95A": "FB45", + "F959": "FB49", + "F957": "FB47", + "F956": "FB4A", + "F952": "FB4B", + "F751": "FB4C", + "F94F": "FB4D", + "F94E": "FB4E", + "F94D": "FB4F", + "F94B": "FB50", + "F949": "FB51", + "F947": "FB52", + "F944": "FB54", + "F941": "FB57", + "F942": "FB55", + "F8FC": "FB59", + "F7DF": "FB5A", + "F7A9": "FB5B", + "F86D": "FB5C", + "F8F7": "FB61", + "F8F5": "FB65", + "F8F1": "FB67", + "F8F3": "FB68", + "F8F0": "FB6A", + "F8EE": "FB6B", + "F8ED": "FB6D", + "F8E8": "FB6F", + "F853": "FB71", + "F8E7": "FB72", + "F6B9": "FB7C", + "F877": "FB83", + "F8DC": "FB84", + "F872": "FB85", + "F873": "FB87", + "F6C4": "FB88", + "F8D2": "FB8A", + "F75F": "FB8D", + "F7E5": "FB8F", + "F8CF": "FA5C", + "F6D5": "FB90", + "F8CA": "FB93", + "F6C6": "FB94", + "F8C9": "FB95", + "F865": "FA60", + "F8C7": "FB9B", + "F7F3": "FB9E", + "F9F1": "FBA2", + "F84C": "FA5D", + "F8BF": "FBA5", + "F8BE": "FBA7", + "F8BC": "FBA8", + "F8BB": "FBAA", + "F84B": "FBAC", + "F8B9": "FBAD", + "F8B8": "FBAE", + "F84A": "FBAF", + "F6CB": "FBB6", + "F7F0": "FBB8", + "F8B4": "FBB9", + "F8B2": "FBBB", + "F8B1": "FBBF", + "F7E6": "FBC0", + "F7E2": "FBC4", + "F849": "FBC7", + "F8AE": "FA5F", + "F8AD": "FBCC", + "F8AB": "FBD6", + "F8AC": "FBD5", + "F8AA": "FBD9", + "F848": "FBDC", + "F766": "FBDD", + "F8A8": "FA5E", + "F8A4": "FBE2", + "F8A5": "FBE3", + "F8A0": "FBEB", + "F89F": "FBEC", + "F882": "FBED", + "F883": "FBEE", + "F884": "FBF0", + "F885": "FBF1", + "F887": "FBF3", + "F88A": "FBF4", + "F88B": "FBF5", + "F847": "FBFB", + "F7E0": "FC42", + "F88D": "FC41", + "F74B": "FC43", + "F88E": "FC44", + "F88F": "FC46", + "F6D7": "FC4A", + "F89D": "FC4B", + "F6AA": "FBF6", + "F6DC": "FAD0", + "F772": "FB7D", + "F7AA": "FB92", + "F84D": "FB97", + "F85D": "FABD", + "F863": "FA7D", + "F866": "FAD8", + "F879": "FB89", + "F886": "FBF2", + "F88C": "FBFC", + "F8B0": "FBC1", + "F8BA": "FBAB", + "F8DA": "FB86", + "F95D": "FB43", + "F963": "FAF8", + "F985": "FACD", + "F9BD": "FA87", + "F9C2": "FA80", + "F9C6": "FA7A", + "F9D4": "FA6D", + "F973": "FAE0", + "F8A2": "FBE9", + "F9AD": "FA9B", + "F785": "FA9C", + "F99B": "FAB1", + "F7F4": "FB7E", + "F8E2": "FB80", + "F7DE": "FB82", + "F895": "FB9F", + "F7DD": "FBA0", + "F6DA": "FBB7", + "F9EC": "FA57", + "F9ED": "FA56" +} \ No newline at end of file diff --git a/s3/config/jskult/task_settings/batch_daily_task_settings.env b/s3/config/jskult/task_settings/batch_daily_task_settings.env new file mode 100644 index 00000000..2185e26b --- /dev/null +++ b/s3/config/jskult/task_settings/batch_daily_task_settings.env @@ -0,0 +1,19 @@ +# jskult batch daily task environment file. +LOG_LEVEL=DEBUG +ULTMARC_DATA_FOLDER=recv +VJSK_DATA_RECEIVE_FOLDER=recv +VJSK_DATA_SEND_FOLDER=send +ULTMARC_BACKUP_FOLDER=ultmarc +VJSK_BACKUP_FOLDER=vjsk +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt +JSKULT_CONFIG_CONVERT_FOLDER=jskult/convert +JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME=ultmarc_hex_convert_config.json +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 +SALES_LAUNDERING_TARGET_YEAR_OFFSET=6 \ No newline at end of file diff --git a/s3/config/jskult/task_settings/batch_laundering_task_settings.env b/s3/config/jskult/task_settings/batch_laundering_task_settings.env new file mode 100644 index 00000000..c80314cf --- /dev/null +++ b/s3/config/jskult/task_settings/batch_laundering_task_settings.env @@ -0,0 +1,8 @@ +# jskult batch laundering task environment file. +LOG_LEVEL=DEBUG +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=7 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau_all +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 diff --git a/s3/config/jskult/task_settings/dbdump_task_settings.env b/s3/config/jskult/task_settings/dbdump_task_settings.env new file mode 100644 index 00000000..9620ee44 --- /dev/null +++ b/s3/config/jskult/task_settings/dbdump_task_settings.env @@ -0,0 +1,7 @@ +# jskult db dump task environment file. +LOG_LEVEL=DEBUG +DUMP_BACKUP_FOLDER=dump +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env new file mode 100644 index 00000000..6746ac01 --- /dev/null +++ b/s3/config/jskult/task_settings/web_task_settings.env @@ -0,0 +1,8 @@ +# webapp task environment file. +AWS_REGION=ap-northeast-1 +AUTHORIZE_ENDPOINT=oauth2/authorize +TOKEN_ENDPOINT=oauth2/token +BIO_SEARCH_RESULT_MAX_COUNT=35000 +BIO_EXCEL_RESULT_MAX_COUNT=15000 +SESSION_EXPIRE_MINUTE=20 +ULTMARC_SEARCH_RESULT_MAX_COUNT=500 diff --git a/s3/config/view_check/check_target_schemas.json b/s3/config/view_check/check_target_schemas.json index 4a7df05b..c8ec5d7f 100644 --- a/s3/config/view_check/check_target_schemas.json +++ b/s3/config/view_check/check_target_schemas.json @@ -1,3 +1,3 @@ { - "check_target_schemas": ["custom01", "custom02", "custom03"] + "check_target_schemas": ["custom01", "custom02", "custom03", "custom04"] } diff --git a/s3/data/crm/settings/CRM_Account.txt b/s3/data/crm/settings/CRM_Account.txt index 4a163455..8790d4db 100644 --- a/s3/data/crm/settings/CRM_Account.txt +++ b/s3/data/crm/settings/CRM_Account.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -248 -Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc -Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc +266 +Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,MSJ_CIAM_Number__c,MSJ_sID__c,MSJ_Application_Materials_Deadline__c,MSJ_DI_Person__c,MSJ_Pharmaceutical_Department_Memo__c,MSJ_Pharmaceutical_Examination_Date__c,MSJ_Pharmaceutical_Examination_Member__c,MSJ_Pharmaceutical_Examination_Rule_Memo__c,MSJ_Pharmaceutical_Examination_Rule__c,MSJ_Pharmacy_Director__c,MSJ_Visit_Regulation__c,MSJ_18_Digit_Salesforce_Id__c,MSJ_Clinical_Trial_Count__c,MSJ_Congresses_Count__c,MSJ_Deletion_H1__c,MSJ_External_Link_To_Full_H1_Profile__c,MSJ_Industry_Payments_Amount__c,MSJ_Publication_Count__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc +Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,MSJ_CIAM_Number__c,MSJ_sID__c,MSJ_Application_Materials_Deadline__c,MSJ_DI_Person__c,MSJ_Pharmaceutical_Department_Memo__c,MSJ_Pharmaceutical_Examination_Date__c,MSJ_Pharmaceutical_Examination_Member__c,MSJ_Pharmaceutical_Examination_Rule_Memo__c,MSJ_Pharmaceutical_Examination_Rule__c,MSJ_Pharmacy_Director__c,MSJ_Visit_Regulation__c,MSJ_18_Digit_Salesforce_Id__c,MSJ_Clinical_Trial_Count__c,MSJ_Congresses_Count__c,MSJ_Deletion_H1__c,MSJ_External_Link_To_Full_H1_Profile__c,MSJ_Industry_Payments_Amount__c,MSJ_Publication_Count__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc src02.crm_Account org02.crm_Account CRM_Account_ex.sql diff --git a/s3/data/crm/settings/CRM_AccountShare_ALL_ex.sql b/s3/data/crm/settings/CRM_AccountShare_ALL_ex.sql index 15bea082..cc2730d5 100644 --- a/s3/data/crm/settings/CRM_AccountShare_ALL_ex.sql +++ b/s3/data/crm/settings/CRM_AccountShare_ALL_ex.sql @@ -1 +1 @@ -CALL src02.crm_data_sync('src02.crm_AccountShare', 'src02.crm_AccountShare_all', 'LastModifiedDate'); \ No newline at end of file +CALL internal02.crm_data_sync('src02.crm_AccountShare', 'src02.crm_AccountShare_all', 'LastModifiedDate'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_AccountShare_ex.sql b/s3/data/crm/settings/CRM_AccountShare_ex.sql index 9105272a..28a2481f 100644 --- a/s3/data/crm/settings/CRM_AccountShare_ex.sql +++ b/s3/data/crm/settings/CRM_AccountShare_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_AccountShare', 'LastModifiedDate'); +CALL internal02.crm_history('src02.crm_AccountShare', 'LastModifiedDate'); diff --git a/s3/data/crm/settings/CRM_Account_ex.sql b/s3/data/crm/settings/CRM_Account_ex.sql index 72836796..79cb2351 100644 --- a/s3/data/crm/settings/CRM_Account_ex.sql +++ b/s3/data/crm/settings/CRM_Account_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Account', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_history('src02.crm_Account', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt b/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt index 0633cbbe..620b1c0d 100644 --- a/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt +++ b/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -53 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c +54 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c,Publish_Method_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c,Publish_Method_vod__c src02.crm_Approved_Document_vod__c org02.crm_Approved_Document_vod__c diff --git a/s3/data/crm/settings/CRM_Call2_Detail_vod__c.txt b/s3/data/crm/settings/CRM_Call2_Detail_vod__c.txt index d79e1b6f..4d854f75 100644 --- a/s3/data/crm/settings/CRM_Call2_Detail_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_Detail_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -17 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Is_Parent_Call_vod__c,Call2_vod__c,Product_vod__c,Detail_Priority_vod__c,Mobile_ID_vod__c,Override_Lock_vod__c,Type_vod__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Is_Parent_Call_vod__c,Call2_vod__c,Product_vod__c,Detail_Priority_vod__c,Mobile_ID_vod__c,Override_Lock_vod__c,Type_vod__c -src02.crm_Call2_Detail_vod__c +18 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Is_Parent_Call_vod__c,Call2_vod__c,Product_vod__c,Detail_Priority_vod__c,Mobile_ID_vod__c,Override_Lock_vod__c,Type_vod__c,Call2_vod__r.RecordTypeId +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Is_Parent_Call_vod__c,Call2_vod__c,Product_vod__c,Detail_Priority_vod__c,Mobile_ID_vod__c,Override_Lock_vod__c,Type_vod__c,medaca_parent_record_type_id +internal02.crm_Call2_Detail_vod__c org02.crm_Call2_Detail_vod__c +CRM_Call2_Detail_vod__c_ex.sql - +truncate_src_table:internal02.crm_Call2_Detail_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_Detail_vod__c_ex.sql b/s3/data/crm/settings/CRM_Call2_Detail_vod__c_ex.sql new file mode 100644 index 00000000..e36edb1f --- /dev/null +++ b/s3/data/crm/settings/CRM_Call2_Detail_vod__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_distribution_Call2_Detail_vod__c(); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_Discussion_vod__c.txt b/s3/data/crm/settings/CRM_Call2_Discussion_vod__c.txt index 9726b561..14fd32f0 100644 --- a/s3/data/crm/settings/CRM_Call2_Discussion_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_Discussion_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -44 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Activity__c,Comments__c,Contact_vod__c,Call_Date_vod__c,Product_Strategy_vod__c,Product_Tactic_vod__c,Restricted_Comments__c,Product_vod__c,Presentation__c,Discussion_Topics__c,Slides__c,User_vod__c,Indication__c,Mobile_ID_vod__c,Medical_Event_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,zvod_Product_Map_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Account_Tactic_vod__c,MSJ_Material_Type__c,MSJ_Discussion_Contents__c,MSJ_IST_Minutes__c,MSJ_Off_Label_Minutes__c,MSJ_Discussion_Objectives__c,MSJ_Insight__c,EMDS_Materials__c,EMDS_Topic__c,MSJ_Visit_Purpose__c,MSJ_Insight_Count__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Activity__c,Comments__c,Contact_vod__c,Call_Date_vod__c,Product_Strategy_vod__c,Product_Tactic_vod__c,Restricted_Comments__c,Product_vod__c,Presentation__c,Discussion_Topics__c,Slides__c,User_vod__c,Indication__c,Mobile_ID_vod__c,Medical_Event_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,zvod_Product_Map_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Account_Tactic_vod__c,MSJ_Material_Type__c,MSJ_Discussion_Contents__c,MSJ_IST_Minutes__c,MSJ_Off_Label_Minutes__c,MSJ_Discussion_Objectives__c,MSJ_Insight__c,EMDS_Materials__c,EMDS_Topic__c,MSJ_Visit_Purpose__c,MSJ_Insight_Count__c -src02.crm_Call2_Discussion_vod__c +45 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Activity__c,Comments__c,Contact_vod__c,Call_Date_vod__c,Product_Strategy_vod__c,Product_Tactic_vod__c,Restricted_Comments__c,Product_vod__c,Presentation__c,Discussion_Topics__c,Slides__c,User_vod__c,Indication__c,Mobile_ID_vod__c,Medical_Event_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,zvod_Product_Map_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Account_Tactic_vod__c,MSJ_Material_Type__c,MSJ_Discussion_Contents__c,MSJ_IST_Minutes__c,MSJ_Off_Label_Minutes__c,MSJ_Discussion_Objectives__c,MSJ_Insight__c,EMDS_Materials__c,EMDS_Topic__c,MSJ_Visit_Purpose__c,MSJ_Insight_Count__c,Call2_vod__r.RecordTypeId +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Activity__c,Comments__c,Contact_vod__c,Call_Date_vod__c,Product_Strategy_vod__c,Product_Tactic_vod__c,Restricted_Comments__c,Product_vod__c,Presentation__c,Discussion_Topics__c,Slides__c,User_vod__c,Indication__c,Mobile_ID_vod__c,Medical_Event_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,zvod_Product_Map_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Account_Tactic_vod__c,MSJ_Material_Type__c,MSJ_Discussion_Contents__c,MSJ_IST_Minutes__c,MSJ_Off_Label_Minutes__c,MSJ_Discussion_Objectives__c,MSJ_Insight__c,EMDS_Materials__c,EMDS_Topic__c,MSJ_Visit_Purpose__c,MSJ_Insight_Count__c,medaca_parent_record_type_id +internal02.crm_Call2_Discussion_vod__c org02.crm_Call2_Discussion_vod__c +CRM_Call2_Discussion_vod__c_ex.sql - +truncate_src_table:internal02.crm_Call2_Discussion_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_Discussion_vod__c_ex.sql b/s3/data/crm/settings/CRM_Call2_Discussion_vod__c_ex.sql new file mode 100644 index 00000000..abeb9882 --- /dev/null +++ b/s3/data/crm/settings/CRM_Call2_Discussion_vod__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_distribution_Call2_Discussion_vod__c(); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt index 219135d6..338efbe3 100644 --- a/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -35 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c -src02.crm_Call2_Key_Message_vod__c +37 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,Share_Channel_vod__c,Call2_vod__r.RecordTypeId +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,Share_Channel_vod__c,medaca_parent_record_type_id +internal02.crm_Call2_Key_Message_vod__c org02.crm_Call2_Key_Message_vod__c +CRM_Call2_Key_Message_vod__c_ex.sql - +truncate_src_table:internal02.crm_Call2_Key_Message_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c_ex.sql b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c_ex.sql new file mode 100644 index 00000000..72fe866e --- /dev/null +++ b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_distribution_Call2_Key_Message_vod__c(); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_vod__c.txt b/s3/data/crm/settings/CRM_Call2_vod__c.txt index c18c205d..69388ce7 100644 --- a/s3/data/crm/settings/CRM_Call2_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -205 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c -src02.crm_Call2_vod__c +210 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,Suggestion_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c,Meeting_Request_vod__c,Phone_vod__c,Detail_Section_Attribute_vod__c,Remote_Meeting_Type_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,Suggestion_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c,Meeting_Request_vod__c,Phone_vod__c,Detail_Section_Attribute_vod__c,Remote_Meeting_Type_vod__c +internal02.crm_Call2_vod__c org02.crm_Call2_vod__c +CRM_Call2_vod__c_ex.sql - +truncate_src_table:internal02.crm_Call2_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call2_vod__c_ex.sql b/s3/data/crm/settings/CRM_Call2_vod__c_ex.sql new file mode 100644 index 00000000..0bdbaa36 --- /dev/null +++ b/s3/data/crm/settings/CRM_Call2_vod__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_distribution_Call2_vod__c(); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call_Clickstream_vod__c.txt b/s3/data/crm/settings/CRM_Call_Clickstream_vod__c.txt index 316eff19..47fc194c 100644 --- a/s3/data/crm/settings/CRM_Call_Clickstream_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call_Clickstream_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -34 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Answer_vod__c,Call_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Popup_Opened_vod__c,Possible_Answers_vod__c,Presentation_ID_vod__c,Product_vod__c,Range_Value_vod__c,Rollover_Entered_vod__c,Selected_Items_vod__c,CLM_ID_vod__c,Question_vod__c,Survey_Type_vod__c,Text_Entered_vod__c,Toggle_Button_On_vod__c,Track_Element_Description_vod__c,Track_Element_Id_vod__c,Track_Element_Type_vod__c,Usage_Duration_vod__c,Usage_Start_Time_vod__c,AuxillaryId_vod__c,ParentId_vod__c,Revision_vod__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Answer_vod__c,Call_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Popup_Opened_vod__c,Possible_Answers_vod__c,Presentation_ID_vod__c,Product_vod__c,Range_Value_vod__c,Rollover_Entered_vod__c,Selected_Items_vod__c,CLM_ID_vod__c,Question_vod__c,Survey_Type_vod__c,Text_Entered_vod__c,Toggle_Button_On_vod__c,Track_Element_Description_vod__c,Track_Element_Id_vod__c,Track_Element_Type_vod__c,Usage_Duration_vod__c,Usage_Start_Time_vod__c,AuxillaryId_vod__c,ParentId_vod__c,Revision_vod__c -src02.crm_Call_Clickstream_vod__c +35 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Answer_vod__c,Call_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Popup_Opened_vod__c,Possible_Answers_vod__c,Presentation_ID_vod__c,Product_vod__c,Range_Value_vod__c,Rollover_Entered_vod__c,Selected_Items_vod__c,CLM_ID_vod__c,Question_vod__c,Survey_Type_vod__c,Text_Entered_vod__c,Toggle_Button_On_vod__c,Track_Element_Description_vod__c,Track_Element_Id_vod__c,Track_Element_Type_vod__c,Usage_Duration_vod__c,Usage_Start_Time_vod__c,AuxillaryId_vod__c,ParentId_vod__c,Revision_vod__c,Call_vod__r.RecordTypeId +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Answer_vod__c,Call_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Popup_Opened_vod__c,Possible_Answers_vod__c,Presentation_ID_vod__c,Product_vod__c,Range_Value_vod__c,Rollover_Entered_vod__c,Selected_Items_vod__c,CLM_ID_vod__c,Question_vod__c,Survey_Type_vod__c,Text_Entered_vod__c,Toggle_Button_On_vod__c,Track_Element_Description_vod__c,Track_Element_Id_vod__c,Track_Element_Type_vod__c,Usage_Duration_vod__c,Usage_Start_Time_vod__c,AuxillaryId_vod__c,ParentId_vod__c,Revision_vod__c,medaca_parent_record_type_id +internal02.crm_Call_Clickstream_vod__c org02.crm_Call_Clickstream_vod__c +CRM_Call_Clickstream_vod__c_ex.sql - +truncate_src_table:internal02.crm_Call_Clickstream_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Call_Clickstream_vod__c_ex.sql b/s3/data/crm/settings/CRM_Call_Clickstream_vod__c_ex.sql new file mode 100644 index 00000000..e205278b --- /dev/null +++ b/s3/data/crm/settings/CRM_Call_Clickstream_vod__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_distribution_Call_Clickstream_vod__c(); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Child_Account_vod__c.txt b/s3/data/crm/settings/CRM_Child_Account_vod__c.txt index 38fc8afc..ce397749 100644 --- a/s3/data/crm/settings/CRM_Child_Account_vod__c.txt +++ b/s3/data/crm/settings/CRM_Child_Account_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -57 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c +59 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c,MSJ_Main_Treatment_Plan__c,MSJ_Optimal_Visiting_Hours__c +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c,MSJ_Main_Treatment_Plan__c,MSJ_Optimal_Visiting_Hours__c src02.crm_Child_Account_vod__c org02.crm_Child_Account_vod__c CRM_Child_Account_vod__c_ex.sql diff --git a/s3/data/crm/settings/CRM_Child_Account_vod__c_ex.sql b/s3/data/crm/settings/CRM_Child_Account_vod__c_ex.sql index 74bf0a85..009eff2b 100644 --- a/s3/data/crm/settings/CRM_Child_Account_vod__c_ex.sql +++ b/s3/data/crm/settings/CRM_Child_Account_vod__c_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Child_Account_vod__c', 'SystemModstamp'); +CALL internal02.crm_history('src02.crm_Child_Account_vod__c', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_Clinical_Trial__c.txt b/s3/data/crm/settings/CRM_Clinical_Trial__c.txt new file mode 100644 index 00000000..607cde70 --- /dev/null +++ b/s3/data/crm/settings/CRM_Clinical_Trial__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +26 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Date__c,Description__c,Phase__c,Role__c,Status__c,Sponsor__c,Account__c,End_Date_vod__c,External_ID_vod__c,ID_vod__c,Start_Date_vod__c,MSJ_Clinical_Trial_Full_Title__c,MSJ_External_ID__c,MSJ_Inclusion_Criteria__c +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Date__c,Description__c,Phase__c,Role__c,Status__c,Sponsor__c,Account__c,End_Date_vod__c,External_ID_vod__c,ID_vod__c,Start_Date_vod__c,MSJ_Clinical_Trial_Full_Title__c,MSJ_External_ID__c,MSJ_Inclusion_Criteria__c +src02m.crm_Clinical_Trial__c +org02.crm_Clinical_Trial__c + + diff --git a/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt b/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt index 335b255b..d8bf1999 100644 --- a/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt +++ b/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 46 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,original_material_approved_in_veritas__c,keywords__c,trade_team__c,ewizard_link__c,business_function__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,original_material_approved_in_veritas__c,keywords__c,trade_team__c,ewizard_link__c,business_function__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,business_function__c,ewizard_link__c,keywords__c,original_material_approved_in_veritas__c,trade_team__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,business_function__c,ewizard_link__c,keywords__c,original_material_approved_in_veritas__c,trade_team__c src02.crm_Clm_Presentation_vod__c org02.crm_Clm_Presentation_vod__c diff --git a/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt b/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt index f863ea3f..8a11df9e 100644 --- a/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt +++ b/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt @@ -5,9 +5,9 @@ utf-8 CRLF 1 144 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Efforts_of_Year__c,MSJ_Efforts_of_Month__c,MSJ_Skill_Task__c,MSJ_Action_of_This_Month__c,MSJ_Achievement_of_This_Month__c,MSJ_Comment_from_AM__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Efforts_of_Year__c,MSJ_Efforts_of_Month__c,MSJ_Skill_Task__c,MSJ_Action_of_This_Month__c,MSJ_Achievement_of_This_Month__c,MSJ_Comment_from_AM__c -src02.crm_Coaching_Report_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Achievement_of_This_Month__c,MSJ_Action_of_This_Month__c,MSJ_Comment_from_AM__c,MSJ_Efforts_of_Month__c,MSJ_Efforts_of_Year__c,MSJ_Skill_Task__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Achievement_of_This_Month__c,MSJ_Action_of_This_Month__c,MSJ_Comment_from_AM__c,MSJ_Efforts_of_Month__c,MSJ_Efforts_of_Year__c,MSJ_Skill_Task__c +src02c.crm_Coaching_Report_vod__c org02.crm_Coaching_Report_vod__c diff --git a/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt b/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt index 686860a2..9a6daa03 100644 --- a/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt +++ b/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -26 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c +27 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c,MSJ_Channel_Type__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c,MSJ_Channel_Type__c src02.crm_Consent_Type_vod__c org02.crm_Consent_Type_vod__c diff --git a/s3/data/crm/settings/CRM_Contact_ex.sql b/s3/data/crm/settings/CRM_Contact_ex.sql index bbcece7f..608c0a87 100644 --- a/s3/data/crm/settings/CRM_Contact_ex.sql +++ b/s3/data/crm/settings/CRM_Contact_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Contact', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_history('src02.crm_Contact', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Directory_vod__c.txt b/s3/data/crm/settings/CRM_Directory_vod__c.txt new file mode 100644 index 00000000..3db7cc48 --- /dev/null +++ b/s3/data/crm/settings/CRM_Directory_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +18 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Display_Order_vod__c,External_ID_vod__c,Level_vod__c,Parent_Directory_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Display_Order_vod__c,External_ID_vod__c,Level_vod__c,Parent_Directory_vod__c +src02.crm_Directory_vod__c +org02.crm_Directory_vod__c + + diff --git a/s3/data/crm/settings/CRM_Dynamic_Attribute_vod__c.txt b/s3/data/crm/settings/CRM_Dynamic_Attribute_vod__c.txt index df089bd8..eaaf304c 100644 --- a/s3/data/crm/settings/CRM_Dynamic_Attribute_vod__c.txt +++ b/s3/data/crm/settings/CRM_Dynamic_Attribute_vod__c.txt @@ -7,7 +7,7 @@ CRLF 26 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Active_vod__c,Dynamic_Attribute_Configuration_vod__c,Dynamic_Attribute_Description_vod__c,Dynamic_Attribute_Help_Text_vod__c,Dynamic_Attribute_Label_vod__c,Dynamic_Attribute_Name_vod__c,Dynamic_Attribute_Record_Type_vod__c,Dynamic_Attribute_Value_Checkbox_vod__c,Dynamic_Attribute_Value_Date_Time_vod__c,Dynamic_Attribute_Value_Date_vod__c,Dynamic_Attribute_Value_Number_vod__c,Dynamic_Attribute_Value_Text_Area_vod__c,Dynamic_Attribute_Value_Text_vod__c,Mobile_ID_vod__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Active_vod__c,Dynamic_Attribute_Configuration_vod__c,Dynamic_Attribute_Description_vod__c,Dynamic_Attribute_Help_Text_vod__c,Dynamic_Attribute_Label_vod__c,Dynamic_Attribute_Name_vod__c,Dynamic_Attribute_Record_Type_vod__c,Dynamic_Attribute_Value_Checkbox_vod__c,Dynamic_Attribute_Value_Date_Time_vod__c,Dynamic_Attribute_Value_Date_vod__c,Dynamic_Attribute_Value_Number_vod__c,Dynamic_Attribute_Value_Text_Area_vod__c,Dynamic_Attribute_Value_Text_vod__c,Mobile_ID_vod__c -src02.crm_Dynamic_Attribute_vod__c +src02c.crm_Dynamic_Attribute_vod__c org02.crm_Dynamic_Attribute_vod__c diff --git a/s3/data/crm/settings/CRM_Email_Activity_vod__c.txt b/s3/data/crm/settings/CRM_Email_Activity_vod__c.txt index 99533859..9b991282 100644 --- a/s3/data/crm/settings/CRM_Email_Activity_vod__c.txt +++ b/s3/data/crm/settings/CRM_Email_Activity_vod__c.txt @@ -7,7 +7,7 @@ CRLF 36 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Sent_Email_vod__c,Activity_DateTime_vod__c,City_vod__c,Click_URL_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Device_Type_vod__c,Event_Msg_vod__c,Event_type_vod__c,IP_Address_vod__c,Region_vod__c,User_Agent_vod__c,Vault_Doc_ID_vod__c,Vault_Doc_Name_vod__c,Vault_Document_Major_Version_vod__c,Vault_Document_Minor_Version_vod__c,Vault_Document_Number_vod__c,Vault_Document_Title_vod__c,Vault_Instance_ID_vod__c,Preference_Modification_vod__c,Approved_Document_vod__c,Link_Name_vod__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Sent_Email_vod__c,Activity_DateTime_vod__c,City_vod__c,Click_URL_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Device_Type_vod__c,Event_Msg_vod__c,Event_type_vod__c,IP_Address_vod__c,Region_vod__c,User_Agent_vod__c,Vault_Doc_ID_vod__c,Vault_Doc_Name_vod__c,Vault_Document_Major_Version_vod__c,Vault_Document_Minor_Version_vod__c,Vault_Document_Number_vod__c,Vault_Document_Title_vod__c,Vault_Instance_ID_vod__c,Preference_Modification_vod__c,Approved_Document_vod__c,Link_Name_vod__c -src02.crm_Email_Activity_vod__c +src02c.crm_Email_Activity_vod__c org02.crm_Email_Activity_vod__c diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt new file mode 100644 index 00000000..9f5e1dfe --- /dev/null +++ b/s3/data/crm/settings/CRM_Event.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +59 +Id,RecordTypeId,WhoId,WhatId,Subject,Location,IsAllDayEvent,ActivityDateTime,ActivityDate,DurationInMinutes,StartDateTime,EndDateTime,EndDate,Description,AccountId,OwnerId,IsPrivate,ShowAs,IsDeleted,IsChild,IsGroupEvent,GroupEventType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateTime,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,ReminderDateTime,IsReminderSet,EventSubtype,IsRecurrence2Exclusion,Recurrence2PatternText,Recurrence2PatternVersion,IsRecurrence2,IsRecurrence2Exception,Recurrence2PatternStartDate,Recurrence2PatternTimeZone,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +Id,RecordTypeId,WhoId,WhatId,Subject,Location,IsAllDayEvent,ActivityDateTime,ActivityDate,DurationInMinutes,StartDateTime,EndDateTime,EndDate,Description,AccountId,OwnerId,IsPrivate,ShowAs,IsDeleted,IsChild,IsGroupEvent,GroupEventType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateTime,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,ReminderDateTime,IsReminderSet,EventSubtype,IsRecurrence2Exclusion,Recurrence2PatternText,Recurrence2PatternVersion,IsRecurrence2,IsRecurrence2Exception,Recurrence2PatternStartDate,Recurrence2PatternTimeZone,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +src02c.crm_Event +org02.crm_Event + + diff --git a/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt b/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt index 5c4ebd49..6551bcbb 100644 --- a/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt +++ b/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -32 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c -src02.crm_Event_Attendee_vod__c +36 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c,MSJ_DirectMail_Status__c,EM_Event_Team_Member_vod__c,Group_Name_vod__c,Role_vod__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c,MSJ_DirectMail_Status__c,EM_Event_Team_Member_vod__c,Group_Name_vod__c,Role_vod__c +src02c.crm_Event_Attendee_vod__c org02.crm_Event_Attendee_vod__c diff --git a/s3/data/crm/settings/CRM_Group_ALL_ex.sql b/s3/data/crm/settings/CRM_Group_ALL_ex.sql index bbd5a51a..699a5bb2 100644 --- a/s3/data/crm/settings/CRM_Group_ALL_ex.sql +++ b/s3/data/crm/settings/CRM_Group_ALL_ex.sql @@ -1 +1 @@ -CALL src02.crm_data_sync('src02.crm_Group', 'src02.crm_Group_all', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_data_sync('src02.crm_Group', 'src02.crm_Group_all', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Group_ex.sql b/s3/data/crm/settings/CRM_Group_ex.sql index ceb8ad2f..e2b6b150 100644 --- a/s3/data/crm/settings/CRM_Group_ex.sql +++ b/s3/data/crm/settings/CRM_Group_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Group', 'SystemModstamp'); +CALL internal02.crm_history('src02.crm_Group', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_Key_Message_vod__c.txt b/s3/data/crm/settings/CRM_Key_Message_vod__c.txt index 5488da44..d4feb972 100644 --- a/s3/data/crm/settings/CRM_Key_Message_vod__c.txt +++ b/s3/data/crm/settings/CRM_Key_Message_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -48 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Description_vod__c,Product_vod__c,Product_Strategy_vod__c,Display_Order_vod__c,Active_vod__c,Category_vod__c,Vehicle_vod__c,CLM_ID_vod__c,Custom_Reaction_vod__c,Slide_Version_vod__c,Language_vod__c,Media_File_CRC_vod__c,Media_File_Name_vod__c,Media_File_Size_vod__c,Segment_vod__c,Disable_Actions_vod__c,VExternal_Id_vod__c,CDN_Path_vod__c,Status_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Is_Shared_Resource_vod__c,iOS_Viewer_vod__c,iOS_Resolution_vod__c,approved_for_distribution_date__c,approved_for_use_date__c,ewizard_link__c,expiration_date__c,keywords__c,trade_team__c,business_function__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Description_vod__c,Product_vod__c,Product_Strategy_vod__c,Display_Order_vod__c,Active_vod__c,Category_vod__c,Vehicle_vod__c,CLM_ID_vod__c,Custom_Reaction_vod__c,Slide_Version_vod__c,Language_vod__c,Media_File_CRC_vod__c,Media_File_Name_vod__c,Media_File_Size_vod__c,Segment_vod__c,Disable_Actions_vod__c,VExternal_Id_vod__c,CDN_Path_vod__c,Status_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Is_Shared_Resource_vod__c,iOS_Viewer_vod__c,iOS_Resolution_vod__c,approved_for_distribution_date__c,approved_for_use_date__c,ewizard_link__c,expiration_date__c,keywords__c,trade_team__c,business_function__c +51 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Description_vod__c,Product_vod__c,Product_Strategy_vod__c,Display_Order_vod__c,Active_vod__c,Category_vod__c,Vehicle_vod__c,CLM_ID_vod__c,Custom_Reaction_vod__c,Slide_Version_vod__c,Language_vod__c,Media_File_CRC_vod__c,Media_File_Name_vod__c,Media_File_Size_vod__c,Segment_vod__c,Disable_Actions_vod__c,VExternal_Id_vod__c,CDN_Path_vod__c,Status_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Is_Shared_Resource_vod__c,iOS_Viewer_vod__c,iOS_Resolution_vod__c,approved_for_distribution_date__c,approved_for_use_date__c,business_function__c,ewizard_link__c,expiration_date__c,keywords__c,trade_team__c,MSJ_Start_Date__c,MSJ_End_Date__c,MSJ_Strategic_Message__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Description_vod__c,Product_vod__c,Product_Strategy_vod__c,Display_Order_vod__c,Active_vod__c,Category_vod__c,Vehicle_vod__c,CLM_ID_vod__c,Custom_Reaction_vod__c,Slide_Version_vod__c,Language_vod__c,Media_File_CRC_vod__c,Media_File_Name_vod__c,Media_File_Size_vod__c,Segment_vod__c,Disable_Actions_vod__c,VExternal_Id_vod__c,CDN_Path_vod__c,Status_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Is_Shared_Resource_vod__c,iOS_Viewer_vod__c,iOS_Resolution_vod__c,approved_for_distribution_date__c,approved_for_use_date__c,business_function__c,ewizard_link__c,expiration_date__c,keywords__c,trade_team__c,MSJ_Start_Date__c,MSJ_End_Date__c,MSJ_Strategic_Message__c src02.crm_Key_Message_vod__c org02.crm_Key_Message_vod__c diff --git a/s3/data/crm/settings/CRM_MSJ_Congresses__c.txt b/s3/data/crm/settings/CRM_MSJ_Congresses__c.txt new file mode 100644 index 00000000..3772340e --- /dev/null +++ b/s3/data/crm/settings/CRM_MSJ_Congresses__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +23 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account__c,MSJ_Conference_Name__c,MSJ_Date_Presented__c,MSJ_End_Date__c,MSJ_External_ID__c,MSJ_Link_to_Section_on_H1_Profile__c,MSJ_Organizer__c,MSJ_Session_Poster_Title__c,MSJ_Session_Poster__c,MSJ_Start_Date__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account__c,MSJ_Conference_Name__c,MSJ_Date_Presented__c,MSJ_End_Date__c,MSJ_External_ID__c,MSJ_Link_to_Section_on_H1_Profile__c,MSJ_Organizer__c,MSJ_Session_Poster_Title__c,MSJ_Session_Poster__c,MSJ_Start_Date__c +src02m.crm_MSJ_Congresses__c +org02.crm_MSJ_Congresses__c + + diff --git a/s3/data/crm/settings/CRM_MSJ_Hospital_Medical_Regimen__c.txt b/s3/data/crm/settings/CRM_MSJ_Hospital_Medical_Regimen__c.txt index 71a825c3..1513cf76 100644 --- a/s3/data/crm/settings/CRM_MSJ_Hospital_Medical_Regimen__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Hospital_Medical_Regimen__c.txt @@ -7,7 +7,7 @@ CRLF 18 Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_Delete_Date__c,MSJ_Delete_Flag__c,MSJ_Indication__c,MSJ_Line__c,MSJ_Medical_Regimen__c,Mobile_ID_vod__c Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_Delete_Date__c,MSJ_Delete_Flag__c,MSJ_Indication__c,MSJ_Line__c,MSJ_Medical_Regimen__c,Mobile_ID_vod__c -src02.crm_MSJ_Hospital_Medical_Regimen__c +src02c.crm_MSJ_Hospital_Medical_Regimen__c org02.crm_MSJ_Hospital_Medical_Regimen__c diff --git a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt index d89f97ae..4ea3e4c9 100644 --- a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -47 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c -src02.crm_MSJ_Inquiry_Assignment__c +52 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c +src02m.crm_MSJ_Inquiry_Assignment__c org02.crm_MSJ_Inquiry_Assignment__c diff --git a/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt b/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt index b559359f..070310ff 100644 --- a/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -35 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c -src02.crm_MSJ_MR_Weekly_Report__c +41 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c,MSJ_Activity_Results_Summary_LC__c,MSJ_Next_Week_Action_Where_LC__c,MSJ_Next_Week_Action_Who_LC__c,MSJ_Next_Week_Action_What_LC__c,MSJ_Next_Week_Action_When_LC__c,MSJ_Target_Patient_Count_LC__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c,MSJ_Activity_Results_Summary_LC__c,MSJ_Next_Week_Action_Where_LC__c,MSJ_Next_Week_Action_Who_LC__c,MSJ_Next_Week_Action_What_LC__c,MSJ_Next_Week_Action_When_LC__c,MSJ_Target_Patient_Count_LC__c +src02c.crm_MSJ_MR_Weekly_Report__c org02.crm_MSJ_MR_Weekly_Report__c diff --git a/s3/data/crm/settings/CRM_MSJ_Medical_Event_Evaluation__c.txt b/s3/data/crm/settings/CRM_MSJ_Medical_Event_Evaluation__c.txt index ba7b5f27..b146e9dc 100644 --- a/s3/data/crm/settings/CRM_MSJ_Medical_Event_Evaluation__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Medical_Event_Evaluation__c.txt @@ -7,7 +7,7 @@ CRLF 14 Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Medical_Event__c,MSJ_Evaluation_Comment__c,MSJ_Evaluation__c,Mobile_ID_vod__c Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Medical_Event__c,MSJ_Evaluation_Comment__c,MSJ_Evaluation__c,Mobile_ID_vod__c -src02.crm_MSJ_Medical_Event_Evaluation__c +src02c.crm_MSJ_Medical_Event_Evaluation__c org02.crm_MSJ_Medical_Event_Evaluation__c diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt index 5c3a103b..9bf209e6 100644 --- a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -37 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c -src02.crm_MSJ_Patient__c +52 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +src02c.crm_MSJ_Patient__c org02.crm_MSJ_Patient__c - +CRM_MSJ_Patient__c_ex.sql diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql new file mode 100644 index 00000000..161d38ea --- /dev/null +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02c.crm_MSJ_Patient__c', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt b/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt index 5393dd99..1750b9e3 100644 --- a/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt +++ b/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -67 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c -src02.crm_Medical_Inquiry_vod__c +69 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c,MSJ_Chatbot_Check__c,MSJ_File_Attached__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c,MSJ_Chatbot_Check__c,MSJ_File_Attached__c +src02m.crm_Medical_Inquiry_vod__c org02.crm_Medical_Inquiry_vod__c diff --git a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt index 349c1f43..74abbaa8 100644 --- a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt +++ b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -54 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c -src02.crm_Medical_Insight_vod__c +66 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Summary_J__c,MSJ_Therapeutic_Area__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Summary_J__c,MSJ_Therapeutic_Area__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c +src02m.crm_Medical_Insight_vod__c org02.crm_Medical_Insight_vod__c diff --git a/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt b/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt index 21b00c22..392e3390 100644 --- a/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt +++ b/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -47 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c -src02.crm_Multichannel_Activity_vod__c +55 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c,MSJ_Activity_Name__c,MSJ_Asset__c,MSJ_CIAM_Account__c,MSJ_Channel__c,MSJ_Content__c,MSJ_Registration_Time__c,MSJ_Related_External_Account_Data__c,MSJ_Tag_Id__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c,MSJ_Activity_Name__c,MSJ_Asset__c,MSJ_CIAM_Account__c,MSJ_Channel__c,MSJ_Content__c,MSJ_Registration_Time__c,MSJ_Related_External_Account_Data__c,MSJ_Tag_Id__c +src02c.crm_Multichannel_Activity_vod__c org02.crm_Multichannel_Activity_vod__c diff --git a/s3/data/crm/settings/CRM_ObjectTerritory2Association_ALL_ex.sql b/s3/data/crm/settings/CRM_ObjectTerritory2Association_ALL_ex.sql index da83e1f8..427d72e6 100644 --- a/s3/data/crm/settings/CRM_ObjectTerritory2Association_ALL_ex.sql +++ b/s3/data/crm/settings/CRM_ObjectTerritory2Association_ALL_ex.sql @@ -1 +1 @@ -CALL src02.crm_data_sync('src02.crm_ObjectTerritory2Association', 'src02.crm_ObjectTerritory2Association_all', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_data_sync('src02.crm_ObjectTerritory2Association', 'src02.crm_ObjectTerritory2Association_all', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_ObjectTerritory2Association_ex.sql b/s3/data/crm/settings/CRM_ObjectTerritory2Association_ex.sql index a12fd378..e21b9e67 100644 --- a/s3/data/crm/settings/CRM_ObjectTerritory2Association_ex.sql +++ b/s3/data/crm/settings/CRM_ObjectTerritory2Association_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_ObjectTerritory2Association', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_history('src02.crm_ObjectTerritory2Association', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_ProcessDefinition.txt b/s3/data/crm/settings/CRM_ProcessDefinition.txt new file mode 100644 index 00000000..90d56974 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessDefinition +org02.crm_ProcessDefinition +CRM_ProcessDefinition_ex.sql + diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt new file mode 100644 index 00000000..ac6f851b --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessDefinition_all +org02.crm_ProcessDefinition_all +CRM_ProcessDefinition_ALL_ex.sql + +truncate_src_table:src02.crm_ProcessDefinition_all diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql new file mode 100644 index 00000000..3b81f574 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessDefinition', 'src02.crm_ProcessDefinition_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql b/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql new file mode 100644 index 00000000..af83cf28 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessDefinition', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessInstance.txt b/s3/data/crm/settings/CRM_ProcessInstance.txt new file mode 100644 index 00000000..b3f9cd76 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstance.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +16 +Id,ProcessDefinitionId,TargetObjectId,Status,CompletedDate,LastActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,SubmittedById,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,ProcessDefinitionId,TargetObjectId,Status,CompletedDate,LastActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,SubmittedById,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessInstance +org02.crm_ProcessInstance + + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceNode.txt b/s3/data/crm/settings/CRM_ProcessInstanceNode.txt new file mode 100644 index 00000000..3c6e3063 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceNode.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +16 +Id,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,ProcessInstanceId,ProcessNodeId,NodeStatus,CompletedDate,LastActorId,ProcessNodeName,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes +Id,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,ProcessInstanceId,ProcessNodeId,NodeStatus,CompletedDate,LastActorId,ProcessNodeName,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes +src02.crm_ProcessInstanceNode +org02.crm_ProcessInstanceNode + + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep.txt b/s3/data/crm/settings/CRM_ProcessInstanceStep.txt new file mode 100644 index 00000000..735ee3f4 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceStep +org02.crm_ProcessInstanceStep +CRM_ProcessInstanceStep_ex.sql + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt new file mode 100644 index 00000000..a1ea6a4f --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceStep_all +org02.crm_ProcessInstanceStep_all +CRM_ProcessInstanceStep_ALL_ex.sql + +truncate_src_table:src02.crm_ProcessInstanceStep_all diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql new file mode 100644 index 00000000..abb06152 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessInstanceStep', 'src02.crm_ProcessInstanceStep_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql b/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql new file mode 100644 index 00000000..39f0af64 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessInstanceStep', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt b/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt new file mode 100644 index 00000000..7db5dc2a --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +11 +Id,ProcessInstanceId,OriginalActorId,ActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,IsDeleted,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,OriginalActorId,ActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,IsDeleted,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceWorkitem +org02.crm_ProcessInstanceWorkitem + + diff --git a/s3/data/crm/settings/CRM_ProcessNode.txt b/s3/data/crm/settings/CRM_ProcessNode.txt new file mode 100644 index 00000000..ab97d394 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +6 +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +src02.crm_ProcessNode +org02.crm_ProcessNode +CRM_ProcessNode_ex.sql + diff --git a/s3/data/crm/settings/CRM_ProcessNode_ALL.txt b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt new file mode 100644 index 00000000..6aea379d --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +6 +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +src02.crm_ProcessNode_all +org02.crm_ProcessNode_all +CRM_ProcessNode_ALL_ex.sql + +truncate_src_table:src02.crm_ProcessNode_all diff --git a/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql new file mode 100644 index 00000000..b81a5836 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessNode', 'src02.crm_ProcessNode_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessNode_ex.sql b/s3/data/crm/settings/CRM_ProcessNode_ex.sql new file mode 100644 index 00000000..1d8d6918 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessNode', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_Product_Metrics_vod__c.txt b/s3/data/crm/settings/CRM_Product_Metrics_vod__c.txt index 1e2e508b..ca7c2dad 100644 --- a/s3/data/crm/settings/CRM_Product_Metrics_vod__c.txt +++ b/s3/data/crm/settings/CRM_Product_Metrics_vod__c.txt @@ -4,10 +4,11 @@ utf-8 " CRLF 1 -52 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Awareness__c,Selling_Stage__c,Formulary_Status__c,Movement__c,Products_vod__c,Segment__c,X12_mo_trx_chg__c,Speaker_Skills__c,Investigator_Readiness__c,Engagements__c,Mobile_ID_vod__c,External_ID_vod__c,MSJ_Patient__c,Detail_Group_vod__c,MSJ_EB_1st_Line_Liver_Meta__c,MSJ_EB_1st_Line_Multi_Meta__c,MSJ_EB_2nd_Line_Mono__c,MSJ_EB_2nd_Line_Combination__c,MSJ_EB_3rd_Line_Mono__c,MSJ_EB_3rd_Line_Combination__c,EMDS_Ability__c,EMDS_Brand_Loyalty__c,EMDS_Decision_Maker__c,EMDS_Early_Tech_Adopter__c,EMDS_Influence__c,EMDS_Main_Driver__c,EMDS_Priority__c,EMDS_Willingness__c,MSJ_KTL_Type__c,MSJ_KTL_Tier__c,MSJ_Publications__c,MSJ_Clinical_Trials__c,MSJ_Speaker_for_Medical_Events__c,MSJ_Advisor_to_Medical_Affairs__c,MSJ_Guidelines_Treatment_Standards__c,MSJ_Therapeutic_Area_Expertise__c,MSJ_MAP_GAP__c,MSJ_Associations__c,MSJ_Tier_Score__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Awareness__c,Selling_Stage__c,Formulary_Status__c,Movement__c,Products_vod__c,Segment__c,X12_mo_trx_chg__c,Speaker_Skills__c,Investigator_Readiness__c,Engagements__c,Mobile_ID_vod__c,External_ID_vod__c,MSJ_Patient__c,Detail_Group_vod__c,MSJ_EB_1st_Line_Liver_Meta__c,MSJ_EB_1st_Line_Multi_Meta__c,MSJ_EB_2nd_Line_Mono__c,MSJ_EB_2nd_Line_Combination__c,MSJ_EB_3rd_Line_Mono__c,MSJ_EB_3rd_Line_Combination__c,EMDS_Ability__c,EMDS_Brand_Loyalty__c,EMDS_Decision_Maker__c,EMDS_Early_Tech_Adopter__c,EMDS_Influence__c,EMDS_Main_Driver__c,EMDS_Priority__c,EMDS_Willingness__c,MSJ_KTL_Type__c,MSJ_KTL_Tier__c,MSJ_Publications__c,MSJ_Clinical_Trials__c,MSJ_Speaker_for_Medical_Events__c,MSJ_Advisor_to_Medical_Affairs__c,MSJ_Guidelines_Treatment_Standards__c,MSJ_Therapeutic_Area_Expertise__c,MSJ_MAP_GAP__c,MSJ_Associations__c,MSJ_Tier_Score__c -src02.crm_Product_Metrics_vod__c +56 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Awareness__c,Selling_Stage__c,Formulary_Status__c,Movement__c,Products_vod__c,Segment__c,X12_mo_trx_chg__c,Speaker_Skills__c,Investigator_Readiness__c,Engagements__c,Mobile_ID_vod__c,External_ID_vod__c,MSJ_Patient__c,Detail_Group_vod__c,MSJ_EB_1st_Line_Liver_Meta__c,MSJ_EB_1st_Line_Multi_Meta__c,MSJ_EB_2nd_Line_Mono__c,MSJ_EB_2nd_Line_Combination__c,MSJ_EB_3rd_Line_Mono__c,MSJ_EB_3rd_Line_Combination__c,EMDS_Ability__c,EMDS_Brand_Loyalty__c,EMDS_Decision_Maker__c,EMDS_Early_Tech_Adopter__c,EMDS_Influence__c,EMDS_Main_Driver__c,EMDS_Priority__c,EMDS_Willingness__c,MSJ_KTL_Type__c,MSJ_KTL_Tier__c,MSJ_Publications__c,MSJ_Clinical_Trials__c,MSJ_Speaker_for_Medical_Events__c,MSJ_Advisor_to_Medical_Affairs__c,MSJ_Guidelines_Treatment_Standards__c,MSJ_Therapeutic_Area_Expertise__c,MSJ_MAP_GAP__c,MSJ_Associations__c,MSJ_Tier_Score__c,MSJ_Primary_Medical_Focus__c,MSJ_Secondary_Medical_Focus__c,MSJ_Tertiary_Medical_Focus__c,Products_vod__r.MSJ_Product_Classification__c +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Awareness__c,Selling_Stage__c,Formulary_Status__c,Movement__c,Products_vod__c,Segment__c,X12_mo_trx_chg__c,Speaker_Skills__c,Investigator_Readiness__c,Engagements__c,Mobile_ID_vod__c,External_ID_vod__c,MSJ_Patient__c,Detail_Group_vod__c,MSJ_EB_1st_Line_Liver_Meta__c,MSJ_EB_1st_Line_Multi_Meta__c,MSJ_EB_2nd_Line_Mono__c,MSJ_EB_2nd_Line_Combination__c,MSJ_EB_3rd_Line_Mono__c,MSJ_EB_3rd_Line_Combination__c,EMDS_Ability__c,EMDS_Brand_Loyalty__c,EMDS_Decision_Maker__c,EMDS_Early_Tech_Adopter__c,EMDS_Influence__c,EMDS_Main_Driver__c,EMDS_Priority__c,EMDS_Willingness__c,MSJ_KTL_Type__c,MSJ_KTL_Tier__c,MSJ_Publications__c,MSJ_Clinical_Trials__c,MSJ_Speaker_for_Medical_Events__c,MSJ_Advisor_to_Medical_Affairs__c,MSJ_Guidelines_Treatment_Standards__c,MSJ_Therapeutic_Area_Expertise__c,MSJ_MAP_GAP__c,MSJ_Associations__c,MSJ_Tier_Score__c,MSJ_Primary_Medical_Focus__c,MSJ_Secondary_Medical_Focus__c,MSJ_Tertiary_Medical_Focus__c,medaca_parent_msj_product_classification__c +internal02.crm_Product_Metrics_vod__c org02.crm_Product_Metrics_vod__c CRM_Product_Metrics_vod__c_ex.sql +truncate_src_table:internal02.crm_Product_Metrics_vod__c \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Product_Metrics_vod__c_ex.sql b/s3/data/crm/settings/CRM_Product_Metrics_vod__c_ex.sql index e97860e5..750905ba 100644 --- a/s3/data/crm/settings/CRM_Product_Metrics_vod__c_ex.sql +++ b/s3/data/crm/settings/CRM_Product_Metrics_vod__c_ex.sql @@ -1 +1,3 @@ -CALL src02.crm_history('src02.crm_Product_Metrics_vod__c', 'SystemModstamp'); +CALL internal02.crm_distribution_Product_Metrics_vod__c(); +CALL internal02.crm_history('src02c.crm_Product_Metrics_vod__c', 'SystemModstamp'); +CALL internal02.crm_history('src02m.crm_Product_Metrics_vod__c', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_Product_vod__c.txt b/s3/data/crm/settings/CRM_Product_vod__c.txt index 360c7c7f..cb5d81fb 100644 --- a/s3/data/crm/settings/CRM_Product_vod__c.txt +++ b/s3/data/crm/settings/CRM_Product_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -53 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c +54 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c,MSJ_Local_Business_Unit__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c,MSJ_Local_Business_Unit__c src02.crm_Product_vod__c org02.crm_Product_vod__c diff --git a/s3/data/crm/settings/CRM_Profile.txt b/s3/data/crm/settings/CRM_Profile.txt index 8835935e..6eae13fd 100644 --- a/s3/data/crm/settings/CRM_Profile.txt +++ b/s3/data/crm/settings/CRM_Profile.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -237 -Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,Description,LastViewedDate,LastReferencedDate -Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,Description,LastViewedDate,LastReferencedDate +255 +Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsEditBillingInfo,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsIsSsoEnabled,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsSalesforceIQInbox,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsAllowObjectDetection,PermissionsSalesforceIQInternal,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsAllowObjectDetectionTraining,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsViewRestrictionAndScopingRules,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsViewMLModels,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,PermissionsBypassMFAForUiLogins,PermissionsClientSecretRotation,PermissionsUpdateReportTypeReferences,PermissionsAccessToServiceProcess,PermissionsManageOrchInstsAndWorkItems,PermissionsCMSECEAuthoringAccess,PermissionsEnableIPFSUpload,PermissionsEnableBCTransactionPolling,PermissionsFSCArcGraphCommunityUser,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsSsoEnabled,Description,LastViewedDate,LastReferencedDate +Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsEditBillingInfo,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsIsSsoEnabled,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsSalesforceIQInbox,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsAllowObjectDetection,PermissionsSalesforceIQInternal,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsAllowObjectDetectionTraining,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsViewRestrictionAndScopingRules,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsViewMLModels,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,PermissionsBypassMFAForUiLogins,PermissionsClientSecretRotation,PermissionsUpdateReportTypeReferences,PermissionsAccessToServiceProcess,PermissionsManageOrchInstsAndWorkItems,PermissionsCMSECEAuthoringAccess,PermissionsEnableIPFSUpload,PermissionsEnableBCTransactionPolling,PermissionsFSCArcGraphCommunityUser,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsSsoEnabled,Description,LastViewedDate,LastReferencedDate src02.crm_Profile org02.crm_Profile CRM_Profile_ex.sql diff --git a/s3/data/crm/settings/CRM_Profile_ex.sql b/s3/data/crm/settings/CRM_Profile_ex.sql index 3a0d9fb3..1e8e2bc5 100644 --- a/s3/data/crm/settings/CRM_Profile_ex.sql +++ b/s3/data/crm/settings/CRM_Profile_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Profile', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_history('src02.crm_Profile', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Publication__c.txt b/s3/data/crm/settings/CRM_Publication__c.txt new file mode 100644 index 00000000..a104e064 --- /dev/null +++ b/s3/data/crm/settings/CRM_Publication__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +25 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Date__c,Title__c,Account__c,Journal__c,External_ID_vod__c,Journal_vod__c,PubMed_ID_Name_vod__c,PubMed_URL_vod__c,Publication_Type_vod__c,MSJ_Authors__c,MSJ_External_ID__c,MSJ_Full_Publication_Title__c,MSJ_Journal__c +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Date__c,Title__c,Account__c,Journal__c,External_ID_vod__c,Journal_vod__c,PubMed_ID_Name_vod__c,PubMed_URL_vod__c,Publication_Type_vod__c,MSJ_Authors__c,MSJ_External_ID__c,MSJ_Full_Publication_Title__c,MSJ_Journal__c +src02m.crm_Publication__c +org02.crm_Publication__c + + diff --git a/s3/data/crm/settings/CRM_Question_Response_vod__c.txt b/s3/data/crm/settings/CRM_Question_Response_vod__c.txt index ef4a8a68..f0549608 100644 --- a/s3/data/crm/settings/CRM_Question_Response_vod__c.txt +++ b/s3/data/crm/settings/CRM_Question_Response_vod__c.txt @@ -7,7 +7,7 @@ CRLF 30 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Survey_Target_vod__c,Answer_Choice_vod__c,Date_vod__c,Datetime_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Number_vod__c,Order_vod__c,Question_Text_vod__c,Required_vod__c,Response_Hash_vod__c,Response_vod__c,Score_vod__c,Survey_Question_vod__c,Text_vod__c,Type_vod__c,Condition_vod__c,Inactive_Condition_vod__c,Source_ID_vod__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Survey_Target_vod__c,Answer_Choice_vod__c,Date_vod__c,Datetime_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Number_vod__c,Order_vod__c,Question_Text_vod__c,Required_vod__c,Response_Hash_vod__c,Response_vod__c,Score_vod__c,Survey_Question_vod__c,Text_vod__c,Type_vod__c,Condition_vod__c,Inactive_Condition_vod__c,Source_ID_vod__c -src02.crm_Question_Response_vod__c +src02c.crm_Question_Response_vod__c org02.crm_Question_Response_vod__c diff --git a/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt b/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt index 921f88d3..b9c5fbf1 100644 --- a/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt +++ b/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -65 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c -src02.crm_Sent_Email_vod__c +66 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c,Email_Group_Id_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c,Email_Group_Id_vod__c +src02c.crm_Sent_Email_vod__c org02.crm_Sent_Email_vod__c diff --git a/s3/data/crm/settings/CRM_Sent_Fragment_vod__c.txt b/s3/data/crm/settings/CRM_Sent_Fragment_vod__c.txt index 8be503f1..d3946a6f 100644 --- a/s3/data/crm/settings/CRM_Sent_Fragment_vod__c.txt +++ b/s3/data/crm/settings/CRM_Sent_Fragment_vod__c.txt @@ -7,7 +7,7 @@ CRLF 16 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Sent_Email_vod__c,Account_vod__c,Email_Template_vod__c,Sent_Fragment_vod__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Sent_Email_vod__c,Account_vod__c,Email_Template_vod__c,Sent_Fragment_vod__c -src02.crm_Sent_Fragment_vod__c +src02c.crm_Sent_Fragment_vod__c org02.crm_Sent_Fragment_vod__c diff --git a/s3/data/crm/settings/CRM_Suggestion_Feedback_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_Feedback_vod__c.txt new file mode 100644 index 00000000..4d68e9f3 --- /dev/null +++ b/s3/data/crm/settings/CRM_Suggestion_Feedback_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +22 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Suggestion_vod__c,Account_vod__c,Activity_Execution_Type_vod__c,Call2_vod__c,Call_Objective_vod__c,DismissFeedback1_vod__c,DismissFeedback2_vod__c,DismissFeedback3_vod__c,DismissFeedback4_vod__c,Mobile_ID_vod__c,Sent_Email_vod__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Suggestion_vod__c,Account_vod__c,Activity_Execution_Type_vod__c,Call2_vod__c,Call_Objective_vod__c,DismissFeedback1_vod__c,DismissFeedback2_vod__c,DismissFeedback3_vod__c,DismissFeedback4_vod__c,Mobile_ID_vod__c,Sent_Email_vod__c +src02c.crm_Suggestion_Feedback_vod__c +org02.crm_Suggestion_Feedback_vod__c + + diff --git a/s3/data/crm/settings/CRM_Suggestion_Tag_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_Tag_vod__c.txt new file mode 100644 index 00000000..e1b7d58c --- /dev/null +++ b/s3/data/crm/settings/CRM_Suggestion_Tag_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +19 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Suggestion_vod__c,Detail_Group_vod__c,Driver_vod__c,Email_Fragment_order_vod__c,Email_Fragment_vod__c,External_ID_vod__c,Product_vod__c,Record_Type_Name_vod__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Suggestion_vod__c,Detail_Group_vod__c,Driver_vod__c,Email_Fragment_order_vod__c,Email_Fragment_vod__c,External_ID_vod__c,Product_vod__c,Record_Type_Name_vod__c +src02c.crm_Suggestion_Tag_vod__c +org02.crm_Suggestion_Tag_vod__c + + diff --git a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt new file mode 100644 index 00000000..e20d8016 --- /dev/null +++ b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +48 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Priority_Score_vod__c,Account_vod__c,Action_Count_vod__c,Actioned_vod__c,Call_Objective_CLM_ID_vod__c,Call_Objective_From_Date_vod__c,Call_Objective_On_By_Default_vod__c,Call_Objective_Record_Type_vod__c,Call_Objective_To_Date_vod__c,Dismiss_Count_vod__c,Dismissed_vod__c,Display_Dismiss_vod__c,Display_Mark_As_Complete_vod__c,Display_Score_vod__c,Email_Template_ID_vod__c,Email_Template_Vault_ID_vod__c,Email_Template_vod__c,Expiration_Date_vod__c,Mark_Complete_Count_vod__c,Marked_As_Complete_vod__c,No_Homepage_vod__c,Planned_Call_Date_vod__c,Posted_Date_vod__c,Priority_vod__c,Reason_vod__c,Record_Type_Name_vod__c,Suggestion_External_Id_vod__c,Suppress_Reason_vod__c,Title_vod__c,Suggestion_Survey_vod__c,Category_vod__c,MSJ_Data_Id__c,MSJ_Reason_unformatted__c,MSJ_reason_id__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Priority_Score_vod__c,Account_vod__c,Action_Count_vod__c,Actioned_vod__c,Call_Objective_CLM_ID_vod__c,Call_Objective_From_Date_vod__c,Call_Objective_On_By_Default_vod__c,Call_Objective_Record_Type_vod__c,Call_Objective_To_Date_vod__c,Dismiss_Count_vod__c,Dismissed_vod__c,Display_Dismiss_vod__c,Display_Mark_As_Complete_vod__c,Display_Score_vod__c,Email_Template_ID_vod__c,Email_Template_Vault_ID_vod__c,Email_Template_vod__c,Expiration_Date_vod__c,Mark_Complete_Count_vod__c,Marked_As_Complete_vod__c,No_Homepage_vod__c,Planned_Call_Date_vod__c,Posted_Date_vod__c,Priority_vod__c,Reason_vod__c,Record_Type_Name_vod__c,Suggestion_External_Id_vod__c,Suppress_Reason_vod__c,Title_vod__c,Suggestion_Survey_vod__c,Category_vod__c,MSJ_Data_Id__c,MSJ_Reason_unformatted__c,MSJ_reason_id__c +src02c.crm_Suggestion_vod__c +org02.crm_Suggestion_vod__c + + diff --git a/s3/data/crm/settings/CRM_Survey_Question_vod__c.txt b/s3/data/crm/settings/CRM_Survey_Question_vod__c.txt index b09d8fe0..5cd8db5a 100644 --- a/s3/data/crm/settings/CRM_Survey_Question_vod__c.txt +++ b/s3/data/crm/settings/CRM_Survey_Question_vod__c.txt @@ -7,7 +7,7 @@ CRLF 23 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Survey_vod__c,Answer_Choice_vod__c,External_ID_vod__c,Max_Score_vod__c,Min_Score_vod__c,Order_vod__c,Question_vod__c,Required_vod__c,Text_vod__c,Condition_vod__c,Source_ID_vod__c,MSJ_External_ID__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Survey_vod__c,Answer_Choice_vod__c,External_ID_vod__c,Max_Score_vod__c,Min_Score_vod__c,Order_vod__c,Question_vod__c,Required_vod__c,Text_vod__c,Condition_vod__c,Source_ID_vod__c,MSJ_External_ID__c -src02.crm_Survey_Question_vod__c +src02c.crm_Survey_Question_vod__c org02.crm_Survey_Question_vod__c diff --git a/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt b/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt index 78520f18..2dba6bbf 100644 --- a/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt +++ b/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -39 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Display_Name_vod__c,Account_vod__c,Channels_vod__c,End_Date_vod__c,Entity_Reference_Id_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Mobile_ID_vod__c,No_Autoassign_vod__c,Not_Completed_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Survey_vod__c,Territory_vod__c,zvod_Address_vod__c,zvod_Specialty_vod__c,Score_vod__c,User_vod__c,Child_Account_vod__c,Location_Entity_Reference_Id_vod__c,Location_vod__c,Target_Type_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Display_Name_vod__c,Account_vod__c,Channels_vod__c,End_Date_vod__c,Entity_Reference_Id_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Mobile_ID_vod__c,No_Autoassign_vod__c,Not_Completed_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Survey_vod__c,Territory_vod__c,zvod_Address_vod__c,zvod_Specialty_vod__c,Score_vod__c,User_vod__c,Child_Account_vod__c,Location_Entity_Reference_Id_vod__c,Location_vod__c,Target_Type_vod__c -src02.crm_Survey_Target_vod__c +40 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Display_Name_vod__c,Account_vod__c,Channels_vod__c,End_Date_vod__c,Entity_Reference_Id_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Mobile_ID_vod__c,No_Autoassign_vod__c,Not_Completed_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Survey_vod__c,Territory_vod__c,zvod_Address_vod__c,zvod_Specialty_vod__c,Score_vod__c,User_vod__c,Suggestion_vod__c,Child_Account_vod__c,Location_Entity_Reference_Id_vod__c,Location_vod__c,Target_Type_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Display_Name_vod__c,Account_vod__c,Channels_vod__c,End_Date_vod__c,Entity_Reference_Id_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Mobile_ID_vod__c,No_Autoassign_vod__c,Not_Completed_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Survey_vod__c,Territory_vod__c,zvod_Address_vod__c,zvod_Specialty_vod__c,Score_vod__c,User_vod__c,Suggestion_vod__c,Child_Account_vod__c,Location_Entity_Reference_Id_vod__c,Location_vod__c,Target_Type_vod__c +src02c.crm_Survey_Target_vod__c org02.crm_Survey_Target_vod__c diff --git a/s3/data/crm/settings/CRM_Survey_vod__c.txt b/s3/data/crm/settings/CRM_Survey_vod__c.txt index 2489f14c..b28056aa 100644 --- a/s3/data/crm/settings/CRM_Survey_vod__c.txt +++ b/s3/data/crm/settings/CRM_Survey_vod__c.txt @@ -7,7 +7,7 @@ CRLF 37 Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Assignment_Type_vod__c,Channels_vod__c,End_Date_vod__c,Expired_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Open_vod__c,Product_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Territory_vod__c,zvod_Questions_vod__c,zvod_Segments_vod__c,zvod_Targets_vod__c,Max_Score_vod__c,Min_Score_vod__c,Autotarget_vod__c,Territories_vod__c,Target_Type_vod__c,MSJ_External_ID__c Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Assignment_Type_vod__c,Channels_vod__c,End_Date_vod__c,Expired_vod__c,External_ID_vod__c,Language_vod__c,Lock_vod__c,Open_vod__c,Product_vod__c,Region_vod__c,Segment_vod__c,Start_Date_vod__c,Status_vod__c,Territory_vod__c,zvod_Questions_vod__c,zvod_Segments_vod__c,zvod_Targets_vod__c,Max_Score_vod__c,Min_Score_vod__c,Autotarget_vod__c,Territories_vod__c,Target_Type_vod__c,MSJ_External_ID__c -src02.crm_Survey_vod__c +src02c.crm_Survey_vod__c org02.crm_Survey_vod__c diff --git a/s3/data/crm/settings/CRM_Task.txt b/s3/data/crm/settings/CRM_Task.txt new file mode 100644 index 00000000..ccc6afb2 --- /dev/null +++ b/s3/data/crm/settings/CRM_Task.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +50 +Id,RecordTypeId,WhoId,WhatId,Subject,ActivityDate,Status,Priority,IsHighPriority,OwnerId,Description,IsDeleted,AccountId,IsClosed,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,CallDurationInSeconds,CallType,CallDisposition,CallObject,ReminderDateTime,IsReminderSet,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateOnly,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,RecurrenceRegeneratedType,TaskSubtype,CompletedDateTime,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +Id,RecordTypeId,WhoId,WhatId,Subject,ActivityDate,Status,Priority,IsHighPriority,OwnerId,Description,IsDeleted,AccountId,IsClosed,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,CallDurationInSeconds,CallType,CallDisposition,CallObject,ReminderDateTime,IsReminderSet,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateOnly,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,RecurrenceRegeneratedType,TaskSubtype,CompletedDateTime,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +src02c.crm_Task +org02.crm_Task + + diff --git a/s3/data/crm/settings/CRM_Territory2_ALL_ex.sql b/s3/data/crm/settings/CRM_Territory2_ALL_ex.sql index d78d0998..e9bd97dd 100644 --- a/s3/data/crm/settings/CRM_Territory2_ALL_ex.sql +++ b/s3/data/crm/settings/CRM_Territory2_ALL_ex.sql @@ -1 +1 @@ -CALL src02.crm_data_sync('src02.crm_Territory2', 'src02.crm_Territory2_all', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_data_sync('src02.crm_Territory2', 'src02.crm_Territory2_all', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_Territory2_ex.sql b/s3/data/crm/settings/CRM_Territory2_ex.sql index 990db101..60cda126 100644 --- a/s3/data/crm/settings/CRM_Territory2_ex.sql +++ b/s3/data/crm/settings/CRM_Territory2_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_Territory2', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_history('src02.crm_Territory2', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_User.txt b/s3/data/crm/settings/CRM_User.txt index 1d58107e..2023bb99 100644 --- a/s3/data/crm/settings/CRM_User.txt +++ b/s3/data/crm/settings/CRM_User.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -200 -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c +218 +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation src02.crm_User org02.crm_User diff --git a/s3/data/crm/settings/CRM_UserTerritory2Association_ALL_ex.sql b/s3/data/crm/settings/CRM_UserTerritory2Association_ALL_ex.sql index 9469355d..dc317d1d 100644 --- a/s3/data/crm/settings/CRM_UserTerritory2Association_ALL_ex.sql +++ b/s3/data/crm/settings/CRM_UserTerritory2Association_ALL_ex.sql @@ -1 +1 @@ -CALL src02.crm_data_sync('src02.crm_UserTerritory2Association', 'src02.crm_UserTerritory2Association_all', 'SystemModstamp'); \ No newline at end of file +CALL internal02.crm_data_sync('src02.crm_UserTerritory2Association', 'src02.crm_UserTerritory2Association_all', 'SystemModstamp'); \ No newline at end of file diff --git a/s3/data/crm/settings/CRM_UserTerritory2Association_ex.sql b/s3/data/crm/settings/CRM_UserTerritory2Association_ex.sql index 4d5a9cdf..002fd98d 100644 --- a/s3/data/crm/settings/CRM_UserTerritory2Association_ex.sql +++ b/s3/data/crm/settings/CRM_UserTerritory2Association_ex.sql @@ -1 +1 @@ -CALL src02.crm_history('src02.crm_UserTerritory2Association', 'SystemModstamp'); +CALL internal02.crm_history('src02.crm_UserTerritory2Association', 'SystemModstamp'); diff --git a/s3/data/crm/settings/configmap.config b/s3/data/crm/settings/configmap.config index 9b24ca55..8c4249dc 100644 --- a/s3/data/crm/settings/configmap.config +++ b/s3/data/crm/settings/configmap.config @@ -53,9 +53,27 @@ CRM_Survey_Question_vod__c_[0-9]{14}\.(CSV|csv) CRM_Survey_Question_vod__c.txt CRM_Question_Response_vod__c_[0-9]{14}\.(CSV|csv) CRM_Question_Response_vod__c.txt CRM_Sent_Fragment_vod__c_[0-9]{14}\.(CSV|csv) CRM_Sent_Fragment_vod__c.txt CRM_Sent_Email_vod__c_[0-9]{14}\.(CSV|csv) CRM_Sent_Email_vod__c.txt +CRM_Suggestion_vod__c_[0-9]{14}\.(CSV|csv) CRM_Suggestion_vod__c.txt +CRM_Suggestion_Tag_vod__c_[0-9]{14}\.(CSV|csv) CRM_Suggestion_Tag_vod__c.txt +CRM_Suggestion_Feedback_vod__c_[0-9]{14}\.(CSV|csv) CRM_Suggestion_Feedback_vod__c.txt +CRM_Event_[0-9]{14}\.(CSV|csv) CRM_Event.txt +CRM_Task_[0-9]{14}\.(CSV|csv) CRM_Task.txt +CRM_MSJ_Congresses__c_[0-9]{14}\.(CSV|csv) CRM_MSJ_Congresses__c.txt +CRM_Publication__c_[0-9]{14}\.(CSV|csv) CRM_Publication__c.txt +CRM_Clinical_Trial__c_[0-9]{14}\.(CSV|csv) CRM_Clinical_Trial__c.txt +CRM_ProcessDefinition_[0-9]{14}\.(CSV|csv) CRM_ProcessDefinition.txt +CRM_ProcessInstance_[0-9]{14}\.(CSV|csv) CRM_ProcessInstance.txt +CRM_ProcessInstanceStep_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceStep.txt +CRM_ProcessInstanceNode_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceNode.txt +CRM_ProcessNode_[0-9]{14}\.(CSV|csv) CRM_ProcessNode.txt +CRM_ProcessInstanceWorkitem_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceWorkitem.txt +CRM_Directory_vod__c_[0-9]{14}\.(CSV|csv) CRM_Directory_vod__c.txt /* 【CRMデータ 全件連携】 */ CRM_Territory2_ALL_[0-9]{14}\.(CSV|csv) CRM_Territory2_ALL.txt CRM_UserTerritory2Association_ALL_[0-9]{14}\.(CSV|csv) CRM_UserTerritory2Association_ALL.txt CRM_Group_ALL_[0-9]{14}\.(CSV|csv) CRM_Group_ALL.txt CRM_ObjectTerritory2Association_ALL_[0-9]{14}\.(CSV|csv) CRM_ObjectTerritory2Association_ALL.txt CRM_AccountShare_ALL_[0-9]{14}\.(CSV|csv) CRM_AccountShare_ALL.txt +CRM_ProcessDefinition_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessDefinition_ALL.txt +CRM_ProcessInstanceStep_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceStep_ALL.txt +CRM_ProcessNode_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessNode_ALL.txt diff --git a/s3/data/encise/settings/CLUFM_CLUMST.txt b/s3/data/encise/settings/CLUFM_CLUMST.txt index c2693b08..09d6f561 100644 --- a/s3/data/encise/settings/CLUFM_CLUMST.txt +++ b/s3/data/encise/settings/CLUFM_CLUMST.txt @@ -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 diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index be3baa0e..a6bf5c42 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -20,6 +20,14 @@ resource: - &STG_SG_ECS_ALL "sg-051e0fb9925539592" # セキュリティグループ(ecs-crm-datafetch) - &STG_SG_CRM_DATAFETCH "sg-0b20b7bb1cb1ab886" + # セキュリティグループ(ecs-jskult-batch-daily) + - &STG_SG_JSKULT_BATCH_DAILY "sg-020b3f6a5a6d6a3a0" + # セキュリティグループ(ecs-jskult-dbdump) + - &STG_SG_JSKULT_DBDUMP "sg-0967779af13538a8e" + # セキュリティグループ(ecs-jskult-batch-laundering) + - &STG_SG_JSKULT_BATCH_LAUNDERING "sg-00b9ea30c5c6bb77a" + # セキュリティグループ(ecs-export-dbdump) + - &STG_SG_EXPORT_DBDUMP "sg-03962e5f52b380186" # 本番環境 product: # サブネット(PrivateSubnet1) @@ -30,8 +38,16 @@ resource: - &PRD_SG_ECS_ALL "sg-05df4823fc789b0fa" # セキュリティグループ(ecs-crm-datafetch) - &PRD_SG_CRM_DATAFETCH "sg-04de7fc3357d852af" - + # セキュリティグループ(ecs-jskult-batch-daily) + - &PRD_SG_JSKULT_BATCH_DAILY "sg-0276dc8acc80288cc" + # セキュリティグループ(ecs-jskult-dbdump) + - &PRD_SG_JSKULT_DBDUMP "sg-050ab3bc0d9ed261a" + # セキュリティグループ(ecs-jskult-batch-laundering) + - &PRD_SG_JSKULT_BATCH_LAUNDERING "sg-0d2bc30c1a2939c32" + # セキュリティグループ(ecs-export-dbdump) + - &PRD_SG_EXPORT_DBDUMP "sg-07ce73feffb53fadc" config: + # CRMデータ取得 r-crm-datafetch-state: # ステージング環境 staging: @@ -61,6 +77,7 @@ config: SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-crm-datafetch) SG_CRM_DATAFETCH: *PRD_SG_CRM_DATAFETCH + # データ登録処理 r-data-import-state: # ステージング環境 staging: @@ -74,3 +91,123 @@ config: AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID # 東京リージョン REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # 実消化&アルトマーク 日次バッチ + r-jskult-batch-daily-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-daily) + SG_JSKULT_BATCH_DAILY: *STG_SG_JSKULT_BATCH_DAILY + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-daily) + SG_JSKULT_BATCH_DAILY: *PRD_SG_JSKULT_BATCH_DAILY + # 実消化&アルトマーク 日次dump取得 + r-jskult-dbdump-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-dbdump) + SG_JSKULT_DBDUMP: *STG_SG_JSKULT_DBDUMP + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-dbdump) + SG_JSKULT_DBDUMP: *PRD_SG_JSKULT_DBDUMP + # 実消化&アルトマーク 実績洗替バッチ + r-jskult-batch-laundering-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-laundering) + SG_JSKULT_BATCH_LAUNDERING: *STG_SG_JSKULT_BATCH_LAUNDERING + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-laundering) + SG_JSKULT_BATCH_LAUNDERING: *PRD_SG_JSKULT_BATCH_LAUNDERING + # DBダンプ取得 + r-export-dbdump-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-export-dbdump) + SG_EXPORT_DBDUMP: *STG_SG_EXPORT_DBDUMP + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-export-dbdump) + SG_EXPORT_DBDUMP: *PRD_SG_EXPORT_DBDUMP diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json new file mode 100644 index 00000000..94ea3d86 --- /dev/null +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -0,0 +1,92 @@ +{ + "Comment": "DBダンプ取得ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "ecs": { + "LaunchType": "FARGATE", + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-export-dbdump-ecs", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-export-dbdump", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_EXPORT_DBDUMP}" + ], + "AssignPublicIp": "DISABLED" + } + }, + "Overrides": { + "ContainerOverrides": [ + { + "Name": "mbj-newdwh2021-#{ENV_NAME}-container-export-dbdump", + "Environment": [ + { + "Name": "DB_SCHEMA", + "Value.$": "$.db_schema" + }, + { + "Name": "DUMP_BACKUP_BUCKET", + "Value.$": "$.dump_backup_bucket" + } + ] + } + ] + } + } + }, + "ResultPath": "$.params", + "Next": "exec-export-dbdump" + }, + "exec-export-dbdump": { + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "LaunchType.$": "$.params.ecs.LaunchType", + "Cluster.$": "$.params.ecs.Cluster", + "TaskDefinition.$": "$.params.ecs.TaskDefinition", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration", + "Overrides.$": "$.params.ecs.Overrides" + }, + "ResultPath": "$.result", + "Retry": [ + { + "ErrorEquals": [ + "States.ALL" + ], + "BackoffRate": 2, + "IntervalSeconds": 3, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": [ + "States.ALL" + ], + "Next": "ErrorEnd", + "ResultPath": "$.result" + } + ], + "Next": "NormalEnd", + "Comment": "データ登録処理" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} \ No newline at end of file diff --git a/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json new file mode 100644 index 00000000..07964c60 --- /dev/null +++ b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 日次バッチ起動ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-batch-daily-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_BATCH_DAILY}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-daily" + }, + "exec-batch-daily": { + "Comment": "実消化&アルトマーク 日次バッチ起動", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-batch-daily", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} diff --git a/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json b/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json new file mode 100644 index 00000000..c720e349 --- /dev/null +++ b/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 実績全件洗替バッチ起動ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-batch-laundering-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_BATCH_LAUNDERING}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-laundering" + }, + "exec-batch-laundering": { + "Comment": "実消化&アルトマーク 実績全件洗替バッチ起動", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-batch-laundering", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} diff --git a/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json new file mode 100644 index 00000000..47fc9208 --- /dev/null +++ b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 日次dump取得ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-dbdump-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_DBDUMP}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-dbdump" + }, + "exec-dbdump": { + "Comment": "実消化&アルトマーク 日次dump取得起動", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-dbdump", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +}