diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock
index 4ca22ac8..57f14241 100644
--- a/ecs/crm-datafetch/Pipfile.lock
+++ b/ecs/crm-datafetch/Pipfile.lock
@@ -18,366 +18,35 @@
"default": {
"attrs": {
"hashes": [
- "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836",
- "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"
+ "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04",
+ "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"
],
- "markers": "python_version >= '3.6'",
- "version": "==22.2.0"
+ "markers": "python_version >= '3.7'",
+ "version": "==23.1.0"
},
"boto3": {
"hashes": [
- "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5",
- "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046"
+ "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8",
+ "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434"
],
"index": "pypi",
- "version": "==1.26.97"
+ "version": "==1.26.156"
},
"botocore": {
"hashes": [
- "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a",
- "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82"
+ "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda",
+ "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4"
],
"markers": "python_version >= '3.7'",
- "version": "==1.29.97"
+ "version": "==1.29.156"
},
"certifi": {
"hashes": [
- "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
- "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
+ "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7",
+ "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"
],
"markers": "python_version >= '3.6'",
- "version": "==2022.12.7"
- },
- "charset-normalizer": {
- "hashes": [
- "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6",
- "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1",
- "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e",
- "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373",
- "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62",
- "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230",
- "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be",
- "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c",
- "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0",
- "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448",
- "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f",
- "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649",
- "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d",
- "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0",
- "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706",
- "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a",
- "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59",
- "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23",
- "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5",
- "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb",
- "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e",
- "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e",
- "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c",
- "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28",
- "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d",
- "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41",
- "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974",
- "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce",
- "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f",
- "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1",
- "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d",
- "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8",
- "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017",
- "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31",
- "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7",
- "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8",
- "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e",
- "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14",
- "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd",
- "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d",
- "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795",
- "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b",
- "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b",
- "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b",
- "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203",
- "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f",
- "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19",
- "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1",
- "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a",
- "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac",
- "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9",
- "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0",
- "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137",
- "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f",
- "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6",
- "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5",
- "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909",
- "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f",
- "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0",
- "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324",
- "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755",
- "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb",
- "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854",
- "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c",
- "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60",
- "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84",
- "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0",
- "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b",
- "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1",
- "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531",
- "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1",
- "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11",
- "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326",
- "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df",
- "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"
- ],
- "markers": "python_full_version >= '3.7.0'",
- "version": "==3.1.0"
- },
- "idna": {
- "hashes": [
- "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
- "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==3.4"
- },
- "isodate": {
- "hashes": [
- "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96",
- "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"
- ],
- "version": "==0.6.1"
- },
- "jmespath": {
- "hashes": [
- "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980",
- "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.0.1"
- },
- "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"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==4.9.2"
- },
- "platformdirs": {
- "hashes": [
- "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa",
- "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==3.1.1"
- },
- "pyjwt": {
- "hashes": [
- "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd",
- "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==2.6.0"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
- "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.8.2"
- },
- "pytz": {
- "hashes": [
- "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0",
- "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"
- ],
- "version": "==2022.7.1"
- },
- "requests": {
- "hashes": [
- "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa",
- "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"
- ],
- "markers": "python_version >= '3.7' and python_version < '4'",
- "version": "==2.28.2"
- },
- "requests-file": {
- "hashes": [
- "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e",
- "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"
- ],
- "version": "==1.5.1"
- },
- "requests-toolbelt": {
- "hashes": [
- "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7",
- "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.10.1"
- },
- "s3transfer": {
- "hashes": [
- "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd",
- "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==0.6.0"
- },
- "simple-salesforce": {
- "hashes": [
- "sha256:e46306bb9820fe3036c8873a6ee6b806be9471cca1b454ae24c585784a64b20b",
- "sha256:ff4ca9ae31d1f378fb0dce6e222b91ab6254d3dd5b0062c137822a822517e189"
- ],
- "index": "pypi",
- "version": "==1.12.3"
- },
- "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"
- },
- "tenacity": {
- "hashes": [
- "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0",
- "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"
- ],
- "index": "pypi",
- "version": "==8.2.2"
- },
- "urllib3": {
- "hashes": [
- "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305",
- "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"
- ],
- "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.15"
- },
- "zeep": {
- "hashes": [
- "sha256:6754feb4c34a4b6d65fbc359252bf6654dcce3937bf1d95aae4402a60a8f5939",
- "sha256:72093acfdb1d8360ed400869b73fbf1882b95c4287f798084c42ee0c1ff0e425"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==4.2.1"
- }
- },
- "develop": {
- "attrs": {
- "hashes": [
- "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836",
- "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==22.2.0"
- },
- "autopep8": {
- "hashes": [
- "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1",
- "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"
- ],
- "index": "pypi",
- "version": "==2.0.2"
- },
- "boto3": {
- "hashes": [
- "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5",
- "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046"
- ],
- "index": "pypi",
- "version": "==1.26.97"
- },
- "botocore": {
- "hashes": [
- "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a",
- "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.29.97"
- },
- "certifi": {
- "hashes": [
- "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
- "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2022.12.7"
+ "version": "==2023.5.7"
},
"cffi": {
"hashes": [
@@ -529,102 +198,523 @@
"markers": "python_full_version >= '3.7.0'",
"version": "==3.1.0"
},
- "colorama": {
+ "cryptography": {
"hashes": [
- "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
- "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
+ "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db",
+ "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a",
+ "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039",
+ "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c",
+ "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3",
+ "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485",
+ "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c",
+ "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca",
+ "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5",
+ "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5",
+ "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3",
+ "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb",
+ "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43",
+ "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31",
+ "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc",
+ "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b",
+ "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006",
+ "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a",
+ "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"
],
- "markers": "sys_platform == 'win32'",
- "version": "==0.4.6"
+ "markers": "python_version >= '3.7'",
+ "version": "==41.0.1"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
+ "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==3.4"
+ },
+ "isodate": {
+ "hashes": [
+ "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96",
+ "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"
+ ],
+ "version": "==0.6.1"
+ },
+ "jmespath": {
+ "hashes": [
+ "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980",
+ "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.0.1"
+ },
+ "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"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+ "version": "==4.9.2"
+ },
+ "platformdirs": {
+ "hashes": [
+ "sha256:57e28820ca8094678b807ff529196506d7a21e17156cb1cddb3e74cebce54640",
+ "sha256:ffa199e3fbab8365778c4a10e1fbf1b9cd50707de826eb304b50e57ec0cc8d38"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.6.0"
+ },
+ "pycparser": {
+ "hashes": [
+ "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
+ "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"
+ ],
+ "version": "==2.21"
+ },
+ "pyjwt": {
+ "hashes": [
+ "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1",
+ "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.7.0"
+ },
+ "python-dateutil": {
+ "hashes": [
+ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
+ "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.8.2"
+ },
+ "pytz": {
+ "hashes": [
+ "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588",
+ "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"
+ ],
+ "version": "==2023.3"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
+ "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.31.0"
+ },
+ "requests-file": {
+ "hashes": [
+ "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e",
+ "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"
+ ],
+ "version": "==1.5.1"
+ },
+ "requests-toolbelt": {
+ "hashes": [
+ "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
+ "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==1.0.0"
+ },
+ "s3transfer": {
+ "hashes": [
+ "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346",
+ "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.6.1"
+ },
+ "simple-salesforce": {
+ "hashes": [
+ "sha256:87f1ac1363987ebf9b7a66ac9e7395534ec3f5a9545e08b664cb695dc085b1ac",
+ "sha256:e9205f8041226c8273f020448c7fbd37999d481d25edd67f9bf86dc159cd3939"
+ ],
+ "index": "pypi",
+ "version": "==1.12.4"
+ },
+ "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"
+ },
+ "tenacity": {
+ "hashes": [
+ "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0",
+ "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"
+ ],
+ "index": "pypi",
+ "version": "==8.2.2"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f",
+ "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"
+ ],
+ "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.16"
+ },
+ "zeep": {
+ "hashes": [
+ "sha256:6754feb4c34a4b6d65fbc359252bf6654dcce3937bf1d95aae4402a60a8f5939",
+ "sha256:72093acfdb1d8360ed400869b73fbf1882b95c4287f798084c42ee0c1ff0e425"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==4.2.1"
+ }
+ },
+ "develop": {
+ "autopep8": {
+ "hashes": [
+ "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1",
+ "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"
+ ],
+ "index": "pypi",
+ "version": "==2.0.2"
+ },
+ "boto3": {
+ "hashes": [
+ "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8",
+ "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434"
+ ],
+ "index": "pypi",
+ "version": "==1.26.156"
+ },
+ "botocore": {
+ "hashes": [
+ "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda",
+ "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.29.156"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7",
+ "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==2023.5.7"
+ },
+ "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"
+ ],
+ "version": "==1.15.1"
+ },
+ "charset-normalizer": {
+ "hashes": [
+ "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6",
+ "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1",
+ "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e",
+ "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373",
+ "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62",
+ "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230",
+ "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be",
+ "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c",
+ "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0",
+ "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448",
+ "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f",
+ "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649",
+ "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d",
+ "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0",
+ "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706",
+ "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a",
+ "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59",
+ "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23",
+ "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5",
+ "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb",
+ "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e",
+ "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e",
+ "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c",
+ "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28",
+ "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d",
+ "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41",
+ "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974",
+ "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce",
+ "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f",
+ "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1",
+ "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d",
+ "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8",
+ "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017",
+ "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31",
+ "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7",
+ "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8",
+ "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e",
+ "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14",
+ "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd",
+ "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d",
+ "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795",
+ "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b",
+ "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b",
+ "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b",
+ "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203",
+ "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f",
+ "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19",
+ "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1",
+ "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a",
+ "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac",
+ "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9",
+ "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0",
+ "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137",
+ "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f",
+ "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6",
+ "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5",
+ "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909",
+ "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f",
+ "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0",
+ "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324",
+ "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755",
+ "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb",
+ "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854",
+ "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c",
+ "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60",
+ "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84",
+ "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0",
+ "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b",
+ "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1",
+ "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531",
+ "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1",
+ "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11",
+ "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326",
+ "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df",
+ "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"
+ ],
+ "markers": "python_full_version >= '3.7.0'",
+ "version": "==3.1.0"
},
"coverage": {
"extras": [
"toml"
],
"hashes": [
- "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d",
- "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4",
- "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e",
- "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab",
- "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90",
- "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6",
- "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731",
- "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540",
- "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2",
- "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292",
- "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5",
- "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b",
- "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2",
- "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0",
- "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57",
- "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3",
- "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140",
- "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84",
- "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988",
- "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67",
- "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d",
- "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2",
- "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5",
- "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9",
- "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8",
- "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd",
- "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6",
- "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be",
- "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88",
- "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25",
- "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137",
- "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968",
- "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9",
- "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef",
- "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54",
- "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512",
- "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005",
- "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f",
- "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149",
- "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d",
- "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8",
- "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7",
- "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5",
- "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016",
- "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69",
- "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212",
- "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc",
- "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8",
- "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d",
- "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd",
- "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"
+ "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f",
+ "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2",
+ "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a",
+ "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a",
+ "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01",
+ "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6",
+ "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7",
+ "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f",
+ "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02",
+ "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c",
+ "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063",
+ "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a",
+ "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5",
+ "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959",
+ "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97",
+ "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6",
+ "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f",
+ "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9",
+ "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5",
+ "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f",
+ "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562",
+ "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe",
+ "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9",
+ "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f",
+ "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb",
+ "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb",
+ "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1",
+ "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb",
+ "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250",
+ "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e",
+ "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511",
+ "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5",
+ "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59",
+ "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2",
+ "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d",
+ "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3",
+ "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4",
+ "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de",
+ "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9",
+ "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833",
+ "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0",
+ "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9",
+ "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d",
+ "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050",
+ "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d",
+ "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6",
+ "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353",
+ "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb",
+ "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e",
+ "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8",
+ "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495",
+ "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2",
+ "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd",
+ "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27",
+ "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1",
+ "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818",
+ "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4",
+ "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e",
+ "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850",
+ "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"
],
"markers": "python_version >= '3.7'",
- "version": "==7.2.2"
+ "version": "==7.2.7"
},
"cryptography": {
"hashes": [
- "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1",
- "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7",
- "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06",
- "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84",
- "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915",
- "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074",
- "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5",
- "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3",
- "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9",
- "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3",
- "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011",
- "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536",
- "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a",
- "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f",
- "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480",
- "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac",
- "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0",
- "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108",
- "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828",
- "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354",
- "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612",
- "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3",
- "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"
+ "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db",
+ "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a",
+ "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039",
+ "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c",
+ "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3",
+ "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485",
+ "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c",
+ "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca",
+ "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5",
+ "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5",
+ "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3",
+ "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb",
+ "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43",
+ "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31",
+ "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc",
+ "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b",
+ "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006",
+ "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a",
+ "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"
],
- "markers": "python_version >= '3.6'",
- "version": "==39.0.2"
+ "markers": "python_version >= '3.7'",
+ "version": "==41.0.1"
},
"exceptiongroup": {
"hashes": [
@@ -676,59 +766,59 @@
},
"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:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
+ "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
+ "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431",
+ "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686",
+ "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559",
+ "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc",
+ "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c",
+ "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0",
+ "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4",
+ "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9",
+ "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575",
+ "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
+ "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d",
+ "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3",
+ "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00",
+ "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155",
+ "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac",
+ "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52",
+ "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f",
+ "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8",
+ "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
+ "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24",
+ "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea",
+ "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
+ "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0",
+ "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee",
+ "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be",
+ "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2",
+ "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707",
+ "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6",
+ "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
+ "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779",
+ "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
+ "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c",
+ "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
+ "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee",
+ "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc",
+ "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
+ "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48",
+ "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7",
+ "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e",
+ "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b",
+ "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa",
+ "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5",
+ "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e",
+ "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb",
+ "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9",
+ "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57",
+ "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc",
+ "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"
],
"markers": "python_version >= '3.7'",
- "version": "==2.1.2"
+ "version": "==2.1.3"
},
"mccabe": {
"hashes": [
@@ -740,19 +830,19 @@
},
"moto": {
"hashes": [
- "sha256:363577f7a0cdf639852420f6ba5caa9aa3c90a688feae6315f8ee4bf324b8c27",
- "sha256:63542b7b9f307b00fae460b42d15cf9346de3ad3b1287fba38fc68f3c05e4da4"
+ "sha256:5003126c46ce70fe351ff1cb67dc8d9a5983f403fae13b7628b0fb503d19039e",
+ "sha256:f3e966ba1460751e19eab5356545813b29c05478b47eb0da445d688949339be2"
],
"index": "pypi",
- "version": "==4.1.5"
+ "version": "==4.1.11"
},
"packaging": {
"hashes": [
- "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2",
- "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"
+ "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61",
+ "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"
],
"markers": "python_version >= '3.7'",
- "version": "==23.0"
+ "version": "==23.1"
},
"pluggy": {
"hashes": [
@@ -795,19 +885,19 @@
},
"pytest": {
"hashes": [
- "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e",
- "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"
+ "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295",
+ "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"
],
"index": "pypi",
- "version": "==7.2.2"
+ "version": "==7.3.2"
},
"pytest-cov": {
"hashes": [
- "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b",
- "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"
+ "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6",
+ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"
],
"index": "pypi",
- "version": "==4.0.0"
+ "version": "==4.1.0"
},
"pytest-html": {
"hashes": [
@@ -819,11 +909,11 @@
},
"pytest-metadata": {
"hashes": [
- "sha256:acb739f89fabb3d798c099e9e0c035003062367a441910aaaf2281bc1972ee14",
- "sha256:fcc653f65fe3035b478820b5284fbf0f52803622ee3f60a2faed7a7d3ba1f41e"
+ "sha256:769a9c65d2884bd583bc626b0ace77ad15dbe02dd91a9106d47fd46d9c2569ca",
+ "sha256:a17b1e40080401dc23177599208c52228df463db191c1a573ccdffacd885e190"
],
- "markers": "python_version >= '3.7' and python_version < '4.0'",
- "version": "==2.0.4"
+ "markers": "python_version >= '3.7'",
+ "version": "==3.0.0"
},
"python-dateutil": {
"hashes": [
@@ -881,11 +971,11 @@
},
"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": [
@@ -897,11 +987,11 @@
},
"s3transfer": {
"hashes": [
- "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd",
- "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"
+ "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346",
+ "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"
],
"markers": "python_version >= '3.7'",
- "version": "==0.6.0"
+ "version": "==0.6.1"
},
"six": {
"hashes": [
@@ -921,26 +1011,26 @@
},
"types-pyyaml": {
"hashes": [
- "sha256:19304869a89d49af00be681e7b267414df213f4eb89634c4495fa62e8f942b9f",
- "sha256:5314a4b2580999b2ea06b2e5f9a7763d860d6e09cdf21c0e9561daa9cbd60178"
+ "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f",
+ "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97"
],
- "version": "==6.0.12.8"
+ "version": "==6.0.12.10"
},
"urllib3": {
"hashes": [
- "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305",
- "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"
+ "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f",
+ "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"
],
"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.15"
+ "version": "==1.26.16"
},
"werkzeug": {
"hashes": [
- "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe",
- "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"
+ "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890",
+ "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"
],
- "markers": "python_version >= '3.7'",
- "version": "==2.2.3"
+ "markers": "python_version >= '3.8'",
+ "version": "==2.3.6"
},
"xmltodict": {
"hashes": [
diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example
index 4a0eefbe..97343762 100644
--- a/ecs/jskult-batch-daily/.env.example
+++ b/ecs/jskult-batch-daily/.env.example
@@ -13,4 +13,10 @@ JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar
JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt
VJSK_BACKUP_FOLDER=vjsk
VJSK_DATA_SEND_FOLDER=send
-VJSK_DATA_BUCKET=*************
\ No newline at end of file
+VJSK_DATA_BUCKET=*************
+# 連携データ抽出期間
+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/src/batch/bio_sales/create_bio_sales_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py
index 509d7300..032a6a02 100644
--- 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
@@ -1,5 +1,9 @@
+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('生物由来卸販売ロット分解')
@@ -7,19 +11,388 @@ logger = get_logger('生物由来卸販売ロット分解')
def exec():
"""生物由来卸販売ロット分解"""
- logger.debug('生物由来卸販売ロット分解:起動')
+ 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()
- # # 非同期処理のサンプル
- # import time
- # for _ in range(50):
- # logger.info('処理中')
- # time.sleep(0.5)
- # TODO: ここに処理を追記していく
+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('生物由来ロット分解データの未確定データ削除に成功')
- logger.debug('生物由来卸販売ロット分解:終了')
- return
+
+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/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py
index 0dad2288..96d66ad7 100644
--- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py
+++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py
@@ -24,6 +24,7 @@ def exec():
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施設統合マスタが追加されました。')
@@ -131,7 +132,6 @@ def _insert_dcf_inst_merge_from_com_inst(db: Database) -> tuple[bool, list[dict]
elapsed_time = ElapsedTime()
res = db.execute(insert_sql, params)
logging_sql(logger, insert_sql)
- db.commit()
logger.info(f'COM施設からDCF施設統合マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('COM施設からDCF施設統合マスタの登録に失敗')
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..816a0545
--- /dev/null
+++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py
@@ -0,0 +1,647 @@
+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.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/sales_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py
index f6d682b4..3c086ca5 100644
--- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py
+++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py
@@ -1,5 +1,8 @@
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
+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()
@@ -16,10 +19,14 @@ def exec():
return
# 洗替用マスタ作成
create_inst_merge_for_laundering.exec()
+ # DCF施設統合マスタ日次更新
+ integrate_dcf_inst_merge.exec()
# 施設担当者洗替
emp_chg_inst_laundering.exec()
# 納入先処方元マスタ洗替
ult_ident_presc_laundering.exec()
+ # 卸販売洗替
+ sales_results_laundering.exec()
# # 並列処理のテスト用コード
# import time
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..7f6d4259
--- /dev/null
+++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py
@@ -0,0 +1,167 @@
+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()
+ logger.debug('処理開始')
+ # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除
+ _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):
+ # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除
+ 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):
+ # 卸販売実績テーブル(洗替後)作成
+ 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/db/database.py b/ecs/jskult-batch-daily/src/db/database.py
index f67a21b9..b9a745be 100644
--- a/ecs/jskult-batch-daily/src/db/database.py
+++ b/ecs/jskult-batch-daily/src/db/database.py
@@ -13,15 +13,17 @@ logger = get_logger(__name__)
class Database:
"""データベース操作クラス"""
__connection: Connection = None
- __engine: Engine = 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) -> None:
+ def __init__(self, username: str, password: str, host: str, port: int, schema: str, autocommit: bool = False) -> None:
"""このクラスの新たなインスタンスを初期化します
Args:
@@ -30,12 +32,14 @@ class Database:
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',
@@ -47,16 +51,20 @@ class Database:
query={"charset": "utf8mb4"}
)
- self.__engine = create_engine(
+ 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):
+ def get_instance(cls, autocommit=False):
"""インスタンスを取得します
+ Args:
+ autocommit (bool, optional): 自動コミットモードで接続するかどうか(Trueの場合、トランザクションの有無に限らず即座にコミットされる). Defaults to False.
Returns:
Database: DB操作クラスインスタンス
"""
@@ -65,7 +73,8 @@ class Database:
password=environment.DB_PASSWORD,
host=environment.DB_HOST,
port=environment.DB_PORT,
- schema=environment.DB_SCHEMA
+ schema=environment.DB_SCHEMA,
+ autocommit=autocommit
)
@retry(
@@ -77,12 +86,15 @@ class Database:
stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT))
def connect(self):
"""
- DBに接続します。接続に失敗した場合、リトライします。
+ DBに接続します。接続に失敗した場合、リトライします。\n
+ インスタンスのautocommitがTrueの場合、自動コミットモードで接続する。(明示的なトランザクションも無視される)
Raises:
DBException: 接続失敗
"""
try:
- self.__connection = self.__engine.connect()
+ self.__connection = (
+ self.__autocommit_engine.connect() if self.__autocommit is True
+ else self.__transactional_engine.connect())
except Exception as e:
raise DBException(e)
diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py
index 4144319f..28094c99 100644
--- a/ecs/jskult-batch-daily/src/system_var/environment.py
+++ b/ecs/jskult-batch-daily/src/system_var/environment.py
@@ -25,3 +25,10 @@ DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_AT
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-webapp/.env.example b/ecs/jskult-webapp/.env.example
index e6195f83..0630afe4 100644
--- a/ecs/jskult-webapp/.env.example
+++ b/ecs/jskult-webapp/.env.example
@@ -22,5 +22,6 @@ AWS_REGION=ap-northeast-1
AUTHORIZE_ENDPOINT=oauth2/authorize
TOKEN_ENDPOINT=oauth2/token
BIO_SEARCH_RESULT_MAX_COUNT=35000
+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/Pipfile b/ecs/jskult-webapp/Pipfile
index a8087bce..436b203e 100644
--- a/ecs/jskult-webapp/Pipfile
+++ b/ecs/jskult-webapp/Pipfile
@@ -23,6 +23,7 @@ pandas = "*"
openpyxl = "*"
xlrd = "*"
sqlalchemy = "*"
+mojimoji = "*"
[dev-packages]
autopep8 = "*"
diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock
index 546ea4bd..c18f13a0 100644
--- a/ecs/jskult-webapp/Pipfile.lock
+++ b/ecs/jskult-webapp/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "3fc09dcad05f44b119f92f9955a7731128d9f9b1829240b7689102fb14f82edc"
+ "sha256": "ebbab78060c475a430a1ce8c817736651277c081230c5c0e94f0b0d02f5f46df"
},
"pipfile-spec": 6,
"requires": {
@@ -26,19 +26,19 @@
},
"boto3": {
"hashes": [
- "sha256:30f8ab1cf89d5864a80ba2d5eb5316dbd2a63c9469877e0cffb522630438aa85",
- "sha256:77e8fa7c257f9ed8bfe0c3ffc2ccc47b1cfa27058f99415b6003699d1202e0c0"
+ "sha256:2d4095e2029ce5ceccb25591f13e55aa5b8ba17794de09963654bd9ced45158f",
+ "sha256:dd15823e8c0554d98c18584d9a6a0342c67611c1114ef61495934c2e560f632c"
],
"index": "pypi",
- "version": "==1.26.145"
+ "version": "==1.26.155"
},
"botocore": {
"hashes": [
- "sha256:264a3f19ed280d80711b7e278be09acff7ed379a96432fdf179b4e6e3a687e6a",
- "sha256:65e2a2b1cc70583225f87d6d63736215f93c6234721967bdab872270ba7a1f45"
+ "sha256:32d5da68212e10c060fd484f41df4f7048fc7731ccd16fd00e37b11b6e841142",
+ "sha256:7fbb7ebba5f645c9750fe557b1ea789d40017a028cdaa2c22fcbf06d4a4d3c1d"
],
"markers": "python_version >= '3.7'",
- "version": "==1.29.145"
+ "version": "==1.29.155"
},
"certifi": {
"hashes": [
@@ -206,6 +206,13 @@
"markers": "python_version >= '3.7'",
"version": "==8.1.3"
},
+ "colorama": {
+ "hashes": [
+ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
+ "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
+ ],
+ "version": "==0.4.6"
+ },
"cryptography": {
"hashes": [
"sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db",
@@ -248,11 +255,11 @@
},
"fastapi": {
"hashes": [
- "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982",
- "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"
+ "sha256:95d757511c596409930bd20673358d4a4d709004edb85c5d24d6ffc48fabcbf2",
+ "sha256:b53248ee45f64f19bb7600953696e3edf94b0f7de94df1e5433fc5c6136fa986"
],
"index": "pypi",
- "version": "==0.95.2"
+ "version": "==0.97.0"
},
"greenlet": {
"hashes": [
@@ -408,90 +415,113 @@
},
"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:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
+ "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
+ "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431",
+ "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686",
+ "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559",
+ "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc",
+ "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c",
+ "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0",
+ "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4",
+ "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9",
+ "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575",
+ "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
+ "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d",
+ "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3",
+ "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00",
+ "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155",
+ "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac",
+ "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52",
+ "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f",
+ "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8",
+ "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
+ "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24",
+ "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea",
+ "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
+ "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0",
+ "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee",
+ "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be",
+ "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2",
+ "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707",
+ "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6",
+ "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
+ "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779",
+ "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
+ "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c",
+ "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
+ "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee",
+ "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc",
+ "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
+ "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48",
+ "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7",
+ "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e",
+ "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b",
+ "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa",
+ "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5",
+ "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e",
+ "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb",
+ "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9",
+ "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57",
+ "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc",
+ "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"
],
"markers": "python_version >= '3.7'",
- "version": "==2.1.2"
+ "version": "==2.1.3"
+ },
+ "mojimoji": {
+ "hashes": [
+ "sha256:01a3d73e8b3c641386b1824d5106b8ea5c351a641623c910d89d8f02520c1b0e",
+ "sha256:05b589361b6f35aef96df3a7f64c2a286a7e7aed9865cd7baf1a5876bb4cd16a",
+ "sha256:515f6fa5659d77a172f1fb46950d34674f33cf487e9aa131bf9422cbe127e5f4",
+ "sha256:59cc0af7d3be3b6847c8dcf1a4e0d09cc0646ff64c101308903d14871245403c",
+ "sha256:61c03620528650603b3c92f367d6db2a645c2638408add5ba03fed982af7cd1d",
+ "sha256:7a15864d8de07a487280c528fe3d2aeaad05bb2ce6d8bf201fc1480b0b5db337",
+ "sha256:8a1285040b7ef7ca5bafe095b62b99507cf19e10c6000e3279bc44d9430da3d9",
+ "sha256:9723531661911479bbfce08ec8a62c7b5958a307f33a025fe938d19550b13f9d",
+ "sha256:98f41bf146b731ed4554c60495c53fd96339a52e02b22a869d6eaf2433047505",
+ "sha256:a98fb09bd49245f9d9cd29603b912dc2f94e619e6d2f5b722553a5dbe113ce6c",
+ "sha256:ae5e6e8d4e70849f4217fa00ca7d770354f5a13c04778b6f07f3bceb0a636abd",
+ "sha256:b110101148b920eba60fa4627b904fa18801c5ca3667880494b7f0d25dd1a5fe",
+ "sha256:b2247233f4b3bee6ab601ac7fcbd84124ad91788a7418c1430f93a4bac340218",
+ "sha256:b379781a0cb95eeb79939608b4a013ad7b79ba03b7fe9b795eadc40bd96a06c9",
+ "sha256:d974a034528cb9fb95fcade6f3ffb73dc1dc336e17413486a5094724cbe9e34f",
+ "sha256:f180e2e8ff47e54cc36b0de147bceaf76fab88ef06775835a55b38ef6b82c161",
+ "sha256:f7f4da9e809fa68588e817f1ae351c4274be2366e542c51393657cae7bcf114f"
+ ],
+ "index": "pypi",
+ "version": "==0.0.12"
},
"numpy": {
"hashes": [
- "sha256:04847257662eef90599a1beca30c757d8e562aa8c7d64e91ea465f299469075d",
- "sha256:06bae17a3629416eb5bae3a429655dc075561206b6d3c1ddfa38b51f273bae5c",
- "sha256:1365157813810cfda2be9518806bf32f6b5f56e5e501d8299e3b681d53e405e2",
- "sha256:165b0fb4d5b6349eef7b909be2d61a673bc6e75e0eec43776eea3222385a9d11",
- "sha256:1bed69508b3b97dd3fb8c439352881c1bd232a0c8dd1e11d8df4e68046d434cf",
- "sha256:20dd2352806eb229bc79c4fa308431eaf1721c66f7928950ee0381df98a2d269",
- "sha256:224e8862a1cd357eede831b270b9e6c51d2cbc2bb5cc2e2b8d0c76d52cbd1edc",
- "sha256:236c8ff573c02677b873e0934419c8e9873bd2b35aaba885170b7b43cb26d5da",
- "sha256:416da35914d2fecc3afd31127b1eb1a283df33292cfcb453e1c8fb46d52611a1",
- "sha256:472bdc3ade289d3efa331738b1daa5a529eef0550650f5d5d2eadb936a2f83a5",
- "sha256:48e33b46b7db13de75dd0c1c919b8b297b5d7a4dc50b181066977ee17bed7cc3",
- "sha256:5e7ba92ad63ffded03400d5038af89f7788843794c77ad1a37522fa69762b06f",
- "sha256:7261d100c9bf722057fd5b9cd5b48f2973b17792b41e689eeaf9b55843cd1afd",
- "sha256:763fca81a8d8beb6bf4b9a9bbf4045b0c134c15ea66c81d26e5b8683b1861293",
- "sha256:7cf92c2bfbaf7bd52df1a21e56e8d34cff711594498ecbd02a39df3aaada763b",
- "sha256:8aad2f86d2036622af1e1eb9db94e26618f42a571e02583fa72d5b1983782bf8",
- "sha256:9a18d2c173a44e48e72614748df5624875439af2d352a416b9f3840583ad9efb",
- "sha256:a0dab69ef25ccabf6f066a4902e238767cbbe52bc5ff90aa99514f87812ba76a",
- "sha256:a4a9f1eaa63b5e35e23e5465ed59746b0a680eb5b5da06f2d432f828d32b26c1",
- "sha256:b1a22ae597ee1d0e2336044854b33965fd92e731efe3c2ab965826e02cca2a8c",
- "sha256:bd1de5d7ab75cdf56f2247aace7940dfd0a8fd048e07808358d8fca604f1d102",
- "sha256:dfe2e3845c3b630f6617f9e8a15c8a1cbaf452c9fa32c71ec0a77d09548cd662",
- "sha256:f59080829bbfe46660a201fc17315a4e8ec6e4499ee745bab3df61866f63e771",
- "sha256:f64b730004e500f836f6405ad5cd36d309b6ac065366a0855860155f23eb2ad5",
- "sha256:f8cbdb428d848f03a4f6f534284cf7fb168a6ec0e742357bf65ad268316906ea"
+ "sha256:0ac6edfb35d2a99aaf102b509c8e9319c499ebd4978df4971b94419a116d0790",
+ "sha256:26815c6c8498dc49d81faa76d61078c4f9f0859ce7817919021b9eba72b425e3",
+ "sha256:4aedd08f15d3045a4e9c648f1e04daca2ab1044256959f1f95aafeeb3d794c16",
+ "sha256:4c69fe5f05eea336b7a740e114dec995e2f927003c30702d896892403df6dbf0",
+ "sha256:5177310ac2e63d6603f659fadc1e7bab33dd5a8db4e0596df34214eeab0fee3b",
+ "sha256:5aa48bebfb41f93043a796128854b84407d4df730d3fb6e5dc36402f5cd594c0",
+ "sha256:5b1b90860bf7d8a8c313b372d4f27343a54f415b20fb69dd601b7efe1029c91e",
+ "sha256:6c284907e37f5e04d2412950960894b143a648dea3f79290757eb878b91acbd1",
+ "sha256:6d183b5c58513f74225c376643234c369468e02947b47942eacbb23c1671f25d",
+ "sha256:7412125b4f18aeddca2ecd7219ea2d2708f697943e6f624be41aa5f8a9852cc4",
+ "sha256:7cd981ccc0afe49b9883f14761bb57c964df71124dcd155b0cba2b591f0d64b9",
+ "sha256:85cdae87d8c136fd4da4dad1e48064d700f63e923d5af6c8c782ac0df8044542",
+ "sha256:8aa130c3042052d656751df5e81f6d61edff3e289b5994edcf77f54118a8d9f4",
+ "sha256:95367ccd88c07af21b379be1725b5322362bb83679d36691f124a16357390153",
+ "sha256:9c7211d7920b97aeca7b3773a6783492b5b93baba39e7c36054f6e749fc7490c",
+ "sha256:9e3f2b96e3b63c978bc29daaa3700c028fe3f049ea3031b58aa33fe2a5809d24",
+ "sha256:b76aa836a952059d70a2788a2d98cb2a533ccd46222558b6970348939e55fc24",
+ "sha256:b792164e539d99d93e4e5e09ae10f8cbe5466de7d759fc155e075237e0c274e4",
+ "sha256:c0dc071017bc00abb7d7201bac06fa80333c6314477b3d10b52b58fa6a6e38f6",
+ "sha256:cc3fda2b36482891db1060f00f881c77f9423eead4c3579629940a3e12095fe8",
+ "sha256:d6b267f349a99d3908b56645eebf340cb58f01bd1e773b4eea1a905b3f0e4208",
+ "sha256:d76a84998c51b8b68b40448ddd02bd1081bb33abcdc28beee6cd284fe11036c6",
+ "sha256:e559c6afbca484072a98a51b6fa466aae785cfe89b69e8b856c3191bc8872a82",
+ "sha256:ecc68f11404930e9c7ecfc937aa423e1e50158317bf67ca91736a9864eae0232",
+ "sha256:f1accae9a28dc3cda46a91de86acf69de0d1b5f4edd44a9b0c3ceb8036dfff19"
],
"markers": "python_version < '3.10'",
- "version": "==1.25.0rc1"
+ "version": "==1.25.0"
},
"openpyxl": {
"hashes": [
@@ -541,48 +571,50 @@
},
"pydantic": {
"hashes": [
- "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375",
- "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277",
- "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d",
- "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4",
- "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca",
- "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c",
- "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01",
- "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18",
- "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68",
- "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887",
- "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459",
- "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4",
- "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5",
- "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e",
- "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1",
- "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33",
- "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a",
- "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56",
- "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108",
- "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2",
- "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4",
- "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878",
- "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0",
- "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e",
- "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6",
- "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f",
- "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800",
- "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea",
- "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f",
- "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b",
- "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1",
- "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd",
- "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319",
- "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab",
- "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85",
- "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"
+ "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d",
+ "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a",
+ "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc",
+ "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3",
+ "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a",
+ "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7",
+ "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf",
+ "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f",
+ "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91",
+ "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece",
+ "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29",
+ "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60",
+ "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a",
+ "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305",
+ "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766",
+ "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f",
+ "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8",
+ "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276",
+ "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c",
+ "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60",
+ "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896",
+ "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be",
+ "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb",
+ "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298",
+ "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4",
+ "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572",
+ "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d",
+ "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82",
+ "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0",
+ "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4",
+ "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca",
+ "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1",
+ "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f",
+ "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f",
+ "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6",
+ "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"
],
"markers": "python_version >= '3.7'",
- "version": "==1.10.8"
+ "version": "==1.10.9"
},
"pyjwt": {
- "extras": [],
+ "extras": [
+ "crypto"
+ ],
"hashes": [
"sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1",
"sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"
@@ -592,11 +624,11 @@
},
"pymysql": {
"hashes": [
- "sha256:5072fb2637f8bfff0e7a15a9c02a0f4ba98f97800e12432e1d6d95936ec6d496",
- "sha256:5cc02f2f60936c5d2d6122ffaff27783bd29ba7683ea45a8ab75c5083f00dc20"
+ "sha256:766b72e4370aba94e6266a4dbd62c51fbc6a894c38de25a41a8a01f0461a2387",
+ "sha256:aade29b861e81a3c68a9e90d43f3db257940c0208983a0128b82f1a4cef639aa"
],
"index": "pypi",
- "version": "==1.1.0rc1"
+ "version": "==1.1.0rc2"
},
"pynamodb": {
"hashes": [
@@ -723,50 +755,50 @@
},
"sqlalchemy": {
"hashes": [
- "sha256:1a0754c2d9f0c7982bec0a31138e495ed1f6b8435d7e677c45be60ec18370acf",
- "sha256:1d6320a1d175447dce63618ec997a53836de48ed3b44bbe952f0b4b399b19941",
- "sha256:1e885dacb167077df15af2f9ccdacbd7f5dd0d538a6d74b94074f2cefc7bb589",
- "sha256:201a99f922ac8c780b3929128fbd9df901418877c70e160e19adb05665e51c31",
- "sha256:21c89044fc48a25c2184eba332edeffbbf9367913bb065cd31538235d828f06f",
- "sha256:256b2b9660e51ad7055a9835b12717416cf7288afcf465107413917b6bb2316f",
- "sha256:2e940a8659ef870ae10e0d9e2a6d5aaddf0ff6e91f7d0d7732afc9e8c4be9bbc",
- "sha256:3fb5d09f1d51480f711b69fe28ad42e4f8b08600a85ab2473baee669e1257800",
- "sha256:435f6807fa6a0597d84741470f19db204a7d34625ea121abd63e8d95f673f0c4",
- "sha256:4670ce853cb25f72115a1bbe366ae13cf3f28fc5c87222df14f8d3d55d51816e",
- "sha256:4a75fdb9a84072521bb2ebd31eefe1165d4dccea3039dda701a864f4b5daa17f",
- "sha256:4d61731a35eddb0f667774fe15e5a4831e444d066081d1e809e1b8a0e3f97cae",
- "sha256:51b19887c96d405599880da6a7cbdf8545a7e78ec5683e46a43bac8885e32d0f",
- "sha256:536c86ec81ca89291d533ff41a3a05f9e4e88e01906dcee0751fc7082f3e8d6c",
- "sha256:55ec62ddc0200b4fee94d11abbec7aa25948d5d21cb8df8807f4bdd3c51ba44b",
- "sha256:5cc48a7fda2b5c5b8860494d6c575db3a101a68416492105fed6591dc8a2728a",
- "sha256:670ecf74ee2e70b917028a06446ad26ff9b1195e84b09c3139c215123d57dc30",
- "sha256:6a3f8020e013e9b3b7941dcf20b0fc8f7429daaf7158760846731cbd8caa5e45",
- "sha256:6b42913a0259267e9ee335da0c36498077799e59c5e332d506e72b4f32de781d",
- "sha256:6f5784dfb2d45c19cde03c45c04a54bf47428610106197ed6e6fa79f33bc63d3",
- "sha256:6f80a9c9a9af0e4bd5080cc0955ce70274c28e9b931ad7e0fb07021afcd32af6",
- "sha256:78303719c6f72af97814b0072ad18bee72e70adca8d95cf8fecd59c5e1ddb040",
- "sha256:788d1772fb8dcd12091ca82809eef504ce0f2c423e45284bc351b872966ff554",
- "sha256:79bfe728219239bdc493950ea4a4d15b02138ecb304771f9024d0d6f5f4e3706",
- "sha256:810199d1c5b43603a9e815ae9487aef3ab1ade7ed9c0c485e12519358929fbfe",
- "sha256:88ab245ed2c96265441ed2818977be28c840cfa5204ba167425d6c26eb67b7e7",
- "sha256:933d30273861fe61f014ce2a7e3c364915f5efe9ed250ec1066ca6ea5942c0bd",
- "sha256:994a75b197662e0608b6a76935d7c345f7fd874eac0b7093d561033db61b0e8c",
- "sha256:9b31ebde27575b3b0708673ec14f0c305c4564d995b545148ab7ac0f4d9b847a",
- "sha256:9d810b4aacd5ef4e293aa4ea01f19fca53999e9edcfc4a8ef1146238b30bdc28",
- "sha256:ae1d8deb391ab39cc8f0d5844e588a115ae3717e607d91482023917f920f777f",
- "sha256:bc5c2b0da46c26c5f73f700834f871d0723e1e882641932468d56833bab09775",
- "sha256:cea7c4a3dfc2ca61f88a2b1ddd6b0bfbd116c9b1a361b3b66fd826034b833142",
- "sha256:d14282bf5b4de87f922db3c70858953fd081ef4f05dba6cca3dd705daffe1cc9",
- "sha256:d6b17cb86908e7f88be14007d6afe7d2ab11966e373044137f96a6a4d83eb21c",
- "sha256:da7381a883aee20b7d2ffda17d909b38134b6a625920e65239a1c681881df800",
- "sha256:db269f67ed17b07e80aaa8fba1f650c0d84aa0bdd9d5352e4ac38d5bf47ac568",
- "sha256:df25052b92bd514357a9b370d74f240db890ea79aaa428fb893520e10ee5bc18",
- "sha256:e17fdcb8971e77c439113642ca8861f9465e21fc693bd3916654ceef3ac26883",
- "sha256:f6fd3c88ea4b170d13527e93be1945e69facd917661d3725a63470eb683fbffe",
- "sha256:f7f994a53c0e6b44a2966fd6bfc53e37d34b7dca34e75b6be295de6db598255e"
+ "sha256:0db6734cb5644c55d0262a813b764c6e2cda1e66e939a488b3d6298cdc7344c2",
+ "sha256:0e4645b260cfe375a0603aa117f0a47680864cf37833129da870919e88b08d8f",
+ "sha256:131f0c894c6572cb1bdcf97c92d999d3128c4ff1ca13061296057072f61afe13",
+ "sha256:1e2caba78e7d1f5003e88817b7a1754d4e58f4a8f956dc423bf8e304c568ab09",
+ "sha256:2de1477af7f48c633b8ecb88245aedd811dca88e88aee9e9d787b388abe74c44",
+ "sha256:2f3b6c31b915159b96b68372212fa77f69230b0a32acab40cf539d2823954f5a",
+ "sha256:3ef876615ff4b53e2033022195830ec4941a6e21068611f8d77de60203b90a98",
+ "sha256:43e69c8c1cea0188b7094e22fb93ae1a1890aac748628b7e925024a206f75368",
+ "sha256:53081c6fce0d49bb36d05f12dc87e008c9b0df58a163b792c5fc4ac638925f98",
+ "sha256:5a934eff1a2882137be3384826f997db8441d43b61fda3094923e69fffe474be",
+ "sha256:5e8522b49e0e640287308b68f71cc338446bbe1c226c8f81743baa91b0246e92",
+ "sha256:61f2035dea56ff1a429077e481496f813378beb02b823d2e3e7eb05bc1a7a8ca",
+ "sha256:63ea36c08792a7a8a08958bc806ecff6b491386feeaf14607c3d9d2d9325e67f",
+ "sha256:6e85e315725807c127ad8ba3d628fdb861cf9ebfb0e10c39a97c01e257cdd71b",
+ "sha256:7641f6ed2682de84d77c4894cf2e43700f3cf7a729361d7f9cac98febf3d8614",
+ "sha256:7be04dbe3470fe8dd332fdb48c979887c381ef6c635eddf2dec43d2766111be4",
+ "sha256:81d867c1be5abd49f7e547c108391f371a9d980ba7ec34666c50d683f782b754",
+ "sha256:8544c6e62eacb77d5106e2055ef10f2407fc0dbd547e879f8745b2032eefd2bc",
+ "sha256:8d3cbdb2f07fb0e4b897dc1df39166735e194fb946f28f26f4c9f9801c8b24f7",
+ "sha256:8d6ef848e5afcd1bda3e9a843751f845c0ca888b61e669237680e913d84ec206",
+ "sha256:8e2569dac4e3cb85365b91ab569d06a221e0e17e65ce59949d00c3958946282b",
+ "sha256:90d320fde566b864adbc19abb40ecb80f4e25d6f084639969bb972d5cca16858",
+ "sha256:91eb8f89fcce8f709f8a4d65d265bc48a80264ee14c7c9e955f3222f19b4b39c",
+ "sha256:a08a791c75d6154d46914d1e23bd81d9455f2950ec1de81f2723848c593d2c8b",
+ "sha256:a2e9f50a906d0b81292576a9fb458f8cace904c81a67088f4a2ca9ff2856f55d",
+ "sha256:a5a2856e12cf5f54301ddf043bcbf0552561d61555e1bcf348b63f42b8e1eec2",
+ "sha256:b2801f85c5c0293aa710f8aa5262c707a83c1c203962ae5a22b4d9095e71aa9d",
+ "sha256:b72f4e4def50414164a1d899f2ce4e782a029fad0ed5585981d1611e8ae29a74",
+ "sha256:bdaf89dd82f4a0e1b8b5ffc9cdc0c9551be6175f7eee5af6a838e92ba2e57100",
+ "sha256:c5e333b81fe10d14efebd4e9429b7bb865ed9463ca8bef07a7136dfa1fd4a37b",
+ "sha256:ce1fc3f64fd42d5f763d6b83651471f32920338a1ba107a3186211474861af57",
+ "sha256:d0c96592f54edd571e00ba6b1ed5df8263328ca1da9e78088c0ebc93c2e6562c",
+ "sha256:dc97238fa44be86971270943a0c21c19ce18b8d1596919048e57912e8abc02cc",
+ "sha256:e19546924f0cf2ec930d1faf318b7365e5827276410a513340f31a2b423e96a4",
+ "sha256:f2938edc512dd1fa48653e14c1655ab46144d4450f0e6b33da7acd8ba77fbfd7",
+ "sha256:f387b496a4c9474d8580195bb2660264a3f295a04d3a9d00f4fa15e9e597427e",
+ "sha256:f409f35a0330ab0cb18ece736b86d8b8233c64f4461fcb10993f67afc0ac7e5a",
+ "sha256:f662cf69484c59f8a3435902c40dfc34d86050bdb15e23d437074ce9f153306b",
+ "sha256:fbcc51fdbc89fafe4f4fe66f59372a8be88ded04de34ef438ab04f980beb12d4",
+ "sha256:fc1dae11bd5167f9eb53b3ccad24a79813004612141e76de21cf4c028dc30b34",
+ "sha256:ff6496ad5e9dc8baeb93a151cc2f599d01e5f8928a2aaf0b09a06428fdbaf553"
],
"index": "pypi",
- "version": "==2.0.15"
+ "version": "==2.0.16"
},
"starlette": {
"hashes": [
@@ -808,41 +840,6 @@
"index": "pypi",
"version": "==0.22.0"
},
- "uvloop": {
- "hashes": [
- "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d",
- "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1",
- "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595",
- "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b",
- "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05",
- "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8",
- "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20",
- "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded",
- "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c",
- "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8",
- "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474",
- "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f",
- "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62",
- "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376",
- "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c",
- "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e",
- "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b",
- "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4",
- "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578",
- "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811",
- "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d",
- "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738",
- "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa",
- "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9",
- "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539",
- "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c",
- "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718",
- "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667",
- "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c",
- "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"
- ],
- "version": "==0.17.0"
- },
"watchfiles": {
"hashes": [
"sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911",
diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py
index 09032af5..00e5cb75 100644
--- a/ecs/jskult-webapp/src/controller/login.py
+++ b/ecs/jskult-webapp/src/controller/login.py
@@ -69,16 +69,20 @@ def login(
try:
jwt_token = login_service.login(request.username, request.password)
except NotAuthorizeException as e:
- logger.exception(e)
+ logger.info(f'ログイン失敗:{e}')
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR)
except JWTTokenVerifyException as e:
- logger.exception(e)
+ logger.info(f'ログイン失敗:{e}')
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED)
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}')
@@ -126,12 +130,17 @@ def sso_authorize(
# トークン検証
verified_token = jwt_token.verify_token()
except JWTTokenVerifyException as e:
- logger.exception(e)
+ logger.exception(f'SSOログイン失敗:{e}')
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED)
# トークンからユーザー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}')
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..ea972ad6
--- /dev/null
+++ b/ecs/jskult-webapp/src/controller/master_mainte.py
@@ -0,0 +1,185 @@
+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.model.internal.session import UserSession
+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.session_service import set_session
+from src.system_var import constants
+from src.templates import templates
+
+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 != '1':
+ 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.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)
+ templates_response = templates.TemplateResponse(
+ 'masterMainteMenu.html',
+ {
+ 'request': request,
+ 'menu': menu
+ },
+ headers={'session_key': session.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 != '1':
+ 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)
+
+ # 画面表示用のモデル
+ view_model = InstEmpCsvUploadViewModel()
+ # セッション書き換え
+ 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)
+ templates_response = templates.TemplateResponse(
+ 'instEmpCsvUL.html',
+ {
+ 'request': request,
+ 'view': view_model
+ },
+ headers={'session_key': session.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 != '1':
+ 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)
+
+ # 画面表示用のモデル
+ view_model = InstEmpCsvDownloadViewModel()
+ # セッション書き換え
+ 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)
+ templates_response = templates.TemplateResponse(
+ 'instEmpCsvDL.html',
+ {
+ 'request': request,
+ 'view': view_model
+ },
+ headers={'session_key': session.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 != '1':
+ 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)
+
+ # 画面表示用のモデル
+ view_model = TableOverrideViewModel()
+ # セッション書き換え
+ 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)
+ templates_response = templates.TemplateResponse(
+ 'tableOverride.html',
+ {
+ 'request': request,
+ 'view': view_model
+ },
+ headers={'session_key': session.session_key}
+ )
+ return templates_response
diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py
index 61a1a3a0..96826fce 100644
--- a/ecs/jskult-webapp/src/controller/menu.py
+++ b/ecs/jskult-webapp/src/controller/menu.py
@@ -32,6 +32,7 @@ def menu_view(
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,
@@ -40,6 +41,7 @@ def menu_view(
)
menu = MenuViewModel(
batch_status=batch_status,
+ dump_status=dump_status,
user_model=user
)
# セッション書き換え
diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py
new file mode 100644
index 00000000..825c8b50
--- /dev/null
+++ b/ecs/jskult-webapp/src/controller/ultmarc.py
@@ -0,0 +1,347 @@
+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.session_service import set_session
+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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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.update(
+ actions=[
+ UserSession.last_access_time.set(UserSession.new_last_access_time()),
+ UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
+ ]
+ )
+ session_key = set_session(session)
+ 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/main.py b/ecs/jskult-webapp/src/main.py
index dc7e4178..8717c7cb 100644
--- a/ecs/jskult-webapp/src/main.py
+++ b/ecs/jskult-webapp/src/main.py
@@ -6,7 +6,7 @@ from starlette import status
import src.static as static
from src.controller import (bio, bio_download, healthcheck, login, logout,
- menu, root)
+ master_mainte, menu, root, ultmarc)
from src.controller.sample_send_file import router as sample_router
from src.core import tasks
from src.error.exception_handler import http_exception_handler
@@ -26,9 +26,13 @@ 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_download.router, prefix='/bio')
+# マスタメンテ
+app.include_router(master_mainte.router, prefix='/masterMainte')
# ヘルスチェック用のルーター
app.include_router(healthcheck.router, prefix='/healthcheck')
diff --git a/ecs/jskult-webapp/src/model/db/hdke_tbl.py b/ecs/jskult-webapp/src/model/db/hdke_tbl.py
index 944581d5..9655c6c1 100644
--- a/ecs/jskult-webapp/src/model/db/hdke_tbl.py
+++ b/ecs/jskult-webapp/src/model/db/hdke_tbl.py
@@ -5,3 +5,4 @@ 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/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..f5576a02
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor.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 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]
+ 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..6f20dfb9
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.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 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]
+ 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..b0c8a5d1
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py
@@ -0,0 +1,13 @@
+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]
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..1609e7e3
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py
@@ -0,0 +1,14 @@
+from datetime import date
+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[date]
+ aply_end_ymd: Optional[date]
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..49739dc1
--- /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[str]
+ prmit_bed_num_rcup: Optional[str]
+ prmit_bed_num_mental: Optional[str]
+ prmit_bed_num_infection: Optional[str]
+ prmit_bed_num_tuber: Optional[str]
+ prmit_bed_num_other: Optional[str]
+ prmit_bed_num_sum: Optional[str]
+ ward_abolish_flg: Optional[str]
+ bed_num: Optional[str]
+ 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..788d9748
--- /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 UltmarcTrtCourseDBModel(BaseDBModel):
+ trt_course_name: Optional[str]
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..8194e7c0
--- /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.dict().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..6015731e
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py
@@ -0,0 +1,69 @@
+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]
+ 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),
+ 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,
+ 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..bddd3d9f
--- /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.dict().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/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py
index 70017932..8f5e4875 100644
--- a/ecs/jskult-webapp/src/model/view/bio_view_model.py
+++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py
@@ -127,7 +127,7 @@ class BioViewModel(BaseModel):
return len(self.bio_data) == 0
def is_data_overflow_max_length(self):
- return len(self.bio_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT
+ return len(self.bio_data) > environment.BIO_SEARCH_RESULT_MAX_COUNT
def _format_date_string(self, date_string):
if date_string is None:
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..220294ba
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py
@@ -0,0 +1,5 @@
+from pydantic import BaseModel
+
+
+class InstEmpCsvDownloadViewModel(BaseModel):
+ subtitle: str = '施設担当者データCSVダウンロード'
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..64bde407
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py
@@ -0,0 +1,5 @@
+from pydantic import BaseModel
+
+
+class InstEmpCsvUploadViewModel(BaseModel):
+ subtitle: str = '施設担当者データCSVアップロード'
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
index 647bdec9..7a7970d2 100644
--- a/ecs/jskult-webapp/src/model/view/menu_view_model.py
+++ b/ecs/jskult-webapp/src/model/view/menu_view_model.py
@@ -3,15 +3,20 @@ from typing import Optional
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: Optional[str]
+ dump_status: Optional[str]
user_model: UserViewModel
def is_batch_processing(self):
- return self.batch_status == '1'
+ 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()
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..e03b1fd0
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/table_override_view_model.py
@@ -0,0 +1,5 @@
+from pydantic import BaseModel
+
+
+class TableOverrideViewModel(BaseModel):
+ subtitle: str = 'テーブル上書きコピー'
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..5de18e11
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py
@@ -0,0 +1,92 @@
+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 UltmarcTrtCourseDBModel
+from src.system_var import environment
+
+
+class UltmarcDoctorInfoViewModel(BaseModel):
+ subtitle: str = '医師情報'
+ is_batch_processing: Optional[bool]
+ doctor_info_data: Optional[UltmarcDoctorInfoDBModel]
+ trt_coursed_data: Optional[list[UltmarcTrtCourseDBModel]]
+ sosiety_data: Optional[list[UltmarcSosietyDBModel]]
+ specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]]
+ doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]]
+ doctor_wrkplace_his_data: Optional[list[UltmarcDoctorWrkplaceHisDBModel]]
+ doc_id: Optional[str]
+ post_cnt: Optional[int]
+ page_num: Optional[int]
+
+ # 現在のページ(表示用)
+ 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):
+ return self._format_date_string(self.doctor_info_data.birthday)
+
+ # 開始年月日
+ def is_input_aply_start_ymd_format(self, date_string):
+ if date_string:
+ return self._format_date(date_string)
+ else:
+ return ''
+
+ def is_input_his_aply_start_ymd_format(self, date_string):
+ if date_string:
+ return self._format_date(date_string)
+ else:
+ return ''
+
+ # 終了年月日
+ def is_input_his_aply_end_ymd_format(self, date_string):
+ if date_string:
+ return self._format_date(date_string)
+ else:
+ 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):
+ if date_string is None:
+ return ''
+ date_str = datetime.strptime(date_string, '%Y%m%d')
+ return date_str.strftime('%Y/%m/%d')
+
+ def _format_date(self, date_time):
+ if date_time is None:
+ return ''
+ return date_time.strftime('%Y/%m/%d')
diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py
new file mode 100644
index 00000000..b648cb2f
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py
@@ -0,0 +1,116 @@
+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 environment
+
+
+class UltmarcDoctorViewModel(BaseModel):
+ subtitle: str = '医師検索一覧'
+ is_batch_processing: Optional[bool]
+ prefc_models: list[PrefcMasterModel]
+ doctor_data: Optional[list[UltmarcDoctorDBModel]] = []
+ form_data: Optional[UltmarcDoctorSearchModel]
+
+ def ultmarc_data_json_str(self):
+ def date_handler(obj):
+ return obj.isoformat() if hasattr(obj, 'isoformat') else obj
+ return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
+
+ # ページネーションのページ番号
+ # 検索時は最初のページを表示する
+ # 詳細画面からの遷移時は、元のページを表示する
+ 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 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 _selected_value(self, form_value: str, current_value: str):
+ return 'selected' if form_value == current_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..4244bef4
--- /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: Optional[bool]
+ inst_info_data: Optional[UltmarcInstInfoDBModel]
+ inst_trt_coursed_data: Optional[list[UltmarcInstTrtCourseDBModel]]
+ doctor_wrkplace_count: Optional[int]
+ inst_id: Optional[str]
+ post_cnt: Optional[int]
+ page_num: Optional[int]
+
+ # 未確認
+ 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_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py
new file mode 100644
index 00000000..126371de
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py
@@ -0,0 +1,119 @@
+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 UltmarcInstViewModel(BaseModel):
+ subtitle: str = '施設検索一覧'
+ is_batch_processing: Optional[bool]
+ prefc_models: list[PrefcMasterModel]
+ inst_div_models: list[InstDivMasterModel]
+ inst_data: Optional[list[UltmarcInstDBModel]] = []
+ form_data: Optional[UltmarcInstSearchModel]
+
+ def ultmarc_data_json_str(self):
+ def date_handler(obj):
+ return obj.isoformat() if hasattr(obj, 'isoformat') else obj
+ return json.dumps([model.dict() for model in self.inst_data], ensure_ascii=False, default=date_handler)
+
+ # ページネーションのページ番号
+ # 検索時は最初のページを表示する
+ # 詳細画面からの遷移時は、元のページを表示する
+ 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 len(self.inst_data) == 0
+
+ def is_data_overflow_max_length(self):
+ return 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
index 55f1528a..5b523b4c 100644
--- a/ecs/jskult-webapp/src/model/view/user_view_model.py
+++ b/ecs/jskult-webapp/src/model/view/user_view_model.py
@@ -4,10 +4,10 @@ from pydantic import BaseModel
class UserViewModel(BaseModel):
- bio_flg: str # AUTH_FLG1
- doc_flg: str # AUTH_FLG2
- inst_flg: str # AUTH_FLG3
- master_mainte_flg: str # AUTH_FLG4
+ bio_flg: Optional[str] # AUTH_FLG1
+ doc_flg: Optional[str] # AUTH_FLG2
+ inst_flg: Optional[str] # AUTH_FLG3
+ master_mainte_flg: Optional[str] # AUTH_FLG4
user_flg: Optional[str] # MNTUSER_FLG
def has_ult_doctor_permission(self):
diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py
index 46f5bfcc..967fbbe1 100644
--- a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py
+++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py
@@ -6,7 +6,7 @@ logger = get_logger('日付テーブル取得')
class HdkeTblRepository(BaseRepository):
- FETCH_SQL = "SELECT bch_actf FROM src05.hdke_tbl"
+ FETCH_SQL = "SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl"
def fetch_all(self) -> list[HdkeTblModel]:
try:
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..d4b18505
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/inst_master_repository.py
@@ -0,0 +1,29 @@
+from src.model.db.inst_div_master import InstDivMasterModel
+from src.repositories.base_repository import BaseRepository
+
+
+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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] getOroshiData DB Error. ")
+ print(f"[ERROR] ErrorMessage: {e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..c304f59f
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py
@@ -0,0 +1,31 @@
+from src.model.db.prefc_master import PrefcMasterModel
+from src.repositories.base_repository import BaseRepository
+
+
+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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] getOroshiData DB Error. ")
+ print(f"[ERROR] ErrorMessage: {e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..901078ab
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py
@@ -0,0 +1,185 @@
+from src.db import sql_condition as condition
+from src.db.sql_condition import SQLCondition
+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.util.string_util import is_not_empty
+import mojimoji
+
+
+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,
+ 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
+ \
+ """
+
+ def fetch_many(self, parameter: UltmarcDoctorSearchModel) -> list[UltmarcDoctorDBModel]:
+ try:
+ self._database.connect()
+ # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。
+ clone_parameter = UltmarcDoctorSearchModel(**parameter.dict())
+ where_clause = self.__build_condition(clone_parameter)
+ query = self.FETCH_SQL.format(where_clause=where_clause)
+ result = self._database.execute_select(query, clone_parameter.dict())
+ models = [UltmarcDoctorDBModel(**r) for r in result]
+
+ return models
+ except Exception as e:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
+
+ def __build_condition(self, parameter: UltmarcDoctorSearchModel):
+ where_clauses: list[SQLCondition] = []
+
+ # 医師コード
+ 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 where_clauses:
+ 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.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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..1fab4d45
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py
@@ -0,0 +1,42 @@
+from src.model.db.ultmarc_doctor_wrkplace_his import \
+ UltmarcDoctorWrkplaceHisDBModel
+from src.repositories.base_repository import BaseRepository
+
+
+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
+ FROM com_dr
+ LEFT JOIN com_dr_wrkplace_his ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace_his.dcf_pcf_dr_cd
+ LEFT JOIN com_inst ON com_dr_wrkplace_his.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd
+ LEFT JOIN com_blng_sec ON com_dr_wrkplace_his.blng_sec_cd = com_blng_sec.blng_sec_cd
+ LEFT JOIN com_post as univ_post ON com_dr_wrkplace_his.identity_cd = univ_post.post_cd
+ LEFT JOIN 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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..b05ce6fd
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py
@@ -0,0 +1,63 @@
+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
+
+
+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
+ 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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
+
+ 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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..2522006f
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py
@@ -0,0 +1,194 @@
+from src.db import sql_condition as condition
+from src.db.sql_condition import SQLCondition
+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.util.string_util import is_not_empty
+import mojimoji
+
+
+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
+ \
+ """
+
+ def fetch_many(self, parameter: UltmarcInstSearchModel) -> list[UltmarcInstDBModel]:
+ try:
+ self._database.connect()
+ # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。
+ clone_parameter = UltmarcInstSearchModel(**parameter.dict())
+ where_clause = self.__build_condition(clone_parameter)
+ query = self.FETCH_SQL.format(where_clause=where_clause)
+ result = self._database.execute_select(query, clone_parameter.dict())
+ models = [UltmarcInstDBModel(**r) for r in result]
+
+ return models
+ except Exception as e:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
+
+ def __build_condition(self, parameter: UltmarcInstSearchModel):
+ where_clauses: list[SQLCondition] = []
+
+ # 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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..eaee391a
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py
@@ -0,0 +1,31 @@
+from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel
+from src.repositories.base_repository import BaseRepository
+
+
+class UltmarcInstTrtCourseRepository(BaseRepository):
+
+ FETCH_SQL = """\
+ SELECT 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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..e3c9ac13
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py
@@ -0,0 +1,30 @@
+from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel
+from src.repositories.base_repository import BaseRepository
+
+
+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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..a4927b44
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py
@@ -0,0 +1,32 @@
+from src.model.db.ultmarc_specialist_license import \
+ UltmarcSpecialistLicenseDBModel
+from src.repositories.base_repository import BaseRepository
+
+
+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:
+ self._database.connect()
+ 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:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
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..c76032a3
--- /dev/null
+++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py
@@ -0,0 +1,31 @@
+from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel
+from src.repositories.base_repository import BaseRepository
+
+
+class UltmarcTrtCourseRepository(BaseRepository):
+
+ FETCH_SQL = """\
+ SELECT 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[UltmarcTrtCourseDBModel]:
+ try:
+ self._database.connect()
+ query = self.FETCH_SQL
+ result = self._database.execute_select(query, {'id': id})
+
+ models = [UltmarcTrtCourseDBModel(**r) for r in result]
+ if len(models) == 0:
+ return None
+ return models
+ except Exception as e:
+ # TODO: ファイルへの書き出しはloggerでやる
+ print(f"[ERROR] DB Error : Exception={e.args}")
+ raise e
+ finally:
+ self._database.disconnect()
diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py
index 8188c10f..90f3a5c9 100644
--- a/ecs/jskult-webapp/src/router/session_router.py
+++ b/ecs/jskult-webapp/src/router/session_router.py
@@ -7,7 +7,7 @@ from starlette import status
from src.depends.auth import (check_session_expired, get_current_session,
verify_session)
-from src.error.exceptions import UnexpectedException
+from src.error.exceptions import DBException, UnexpectedException
from src.logging.get_logger import get_logger
from src.system_var import constants, environment
@@ -46,7 +46,10 @@ class MeDaCaRoute(APIRoute):
raise e
except Exception as e:
logger.exception(e)
- raise UnexpectedException(detail=constants.LOGOUT_REASON_UNEXPECTED)
+ 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:
diff --git a/ecs/jskult-webapp/src/services/batch_status_service.py b/ecs/jskult-webapp/src/services/batch_status_service.py
index c9f6c6a7..ffb57af0 100644
--- a/ecs/jskult-webapp/src/services/batch_status_service.py
+++ b/ecs/jskult-webapp/src/services/batch_status_service.py
@@ -4,6 +4,7 @@ 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):
@@ -25,17 +26,30 @@ class BatchStatusService(BaseService):
@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 == '1' # TODO: 定数化する
+ 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/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py
new file mode 100644
index 00000000..5c441421
--- /dev/null
+++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py
@@ -0,0 +1,156 @@
+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_view_model import UltmarcDoctorViewModel
+from src.model.view.ultmarc_inst_info_view_model import \
+ UltmarcInstInfoViewModel
+from src.model.view.ultmarc_inst_view_model import UltmarcInstViewModel
+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 \
+ UltmarcTrtCourseRepository
+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': UltmarcTrtCourseRepository,
+ '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: UltmarcTrtCourseRepository
+ 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
+ ) -> UltmarcDoctorViewModel:
+ # 医師一覧画面の表示データ取得
+ # 都道府県リストを取得
+ prefcs = self.prefc_repository.fetch_all()
+
+ ultmarc = UltmarcDoctorViewModel(
+ 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
+ ) -> UltmarcInstViewModel:
+ # 施設一覧画面の表示データ取得
+ # 都道府県リストを取得
+ prefcs = self.prefc_repository.fetch_all()
+ # 施設区分リストを取得
+ inst_div = self.inst_div_repository.fetch_all()
+
+ ultmarc = UltmarcInstViewModel(
+ 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/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css
new file mode 100644
index 00000000..a59c1681
--- /dev/null
+++ b/ecs/jskult-webapp/src/static/css/masterMainte.css
@@ -0,0 +1,164 @@
+body{
+ background-color: LightCyan;
+ font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif;
+}
+
+h1{
+ margin-left : 1%;
+}
+
+
+/*ヘッダー*/
+.headerTable{
+ width: 100%;
+}
+
+.headerTdLeft{
+ width: 80%;
+}
+
+.headerTdRight{
+ text-align: right;
+ padding-right: 2%;
+ width: 20%;
+}
+
+.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%;
+}
+
+.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;
+}
+
+/*//////////////////////////*/
+/*施設担当者データExcelアップロード*/
+/*//////////////////////////*/
+.inputTable{
+ margin-left: 3%;
+ margin-right: 3%;
+ margin-bottom: 1%;
+ padding-bottom: 1%;
+ border-bottom: solid 1px gray;
+ width: 94%;
+}
+
+.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%;
+}
+
diff --git a/ecs/jskult-webapp/src/static/css/menuStyle.css b/ecs/jskult-webapp/src/static/css/menuStyle.css
index b1920070..3a07d9fc 100644
--- a/ecs/jskult-webapp/src/static/css/menuStyle.css
+++ b/ecs/jskult-webapp/src/static/css/menuStyle.css
@@ -37,7 +37,7 @@ body{
font-size: 160%;
}
-.notUseBioMsg{
+.notUseBioMsg,.notUseMainteMsg{
font-size: 143%;
color: red;
}
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..8d018b01
--- /dev/null
+++ b/ecs/jskult-webapp/src/static/css/ultStyle.css
@@ -0,0 +1,671 @@
+body {
+ background-color: LightCyan;
+ font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif;
+}
+
+h1 {
+ font-size: 150%;
+ margin-left: 2%;
+ margin-top: 0%;
+ margin-bottom: 0%;
+}
+
+table{
+ border-collapse : collapse;
+}
+
+.header_bt{
+ width: 8%;
+ margin-bottom: 0.8%;
+ margin-left: 78.5%;
+}
+
+.search_textbox{
+ width: 100%;
+}
+
+.search_dropdown{
+ width: 100%;
+}
+
+.search_longtextbox{
+ width: 100%
+}
+
+.instSearchResult {
+ width: 100%;
+}
+
+.scroll_table{
+ overflow: auto;
+ white-space: nowrap;
+ margin-bottom: 2%;
+ /*スクロール時カラムが動く問題の修正 width: 100%;をコメントアウト*/
+ width: 100%;
+ height: 250px;
+}
+
+.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: 10%
+}
+
+.search_bt{
+ margin-left: 3%;
+ margin-top: 0.8%;
+ margin-bottom: 0.8%;
+}
+
+.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: 2%;
+}
+
+.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: 7%;
+}
+
+.instDataRight{
+ width: 25%;
+}
+/*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;
+}
+
+.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;
+}
+
+.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: 2%;
+}
+
+.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%;
+}
+
+.docSearchScroll{
+ overflow: auto;
+ white-space: nowrap;
+ margin-bottom: 2%;
+ width: 100%;
+ height: 270px;
+}
+
+.docSearchScroll::-webkit-scrollbar {
+ height: 5px;
+ width: 10px;
+}
+
+.docSearchScroll::-webkit-scrollbar-track {
+ border-radius: 5px;
+ background: #eee;
+}
+
+.docSearchScroll::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ background: #666;
+}
+
+.allOnOffButton{
+ width: 6%;
+}
+
+/*医師情報*/
+.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;
+}
+
+.docSearchScroll_div {
+ overflow: auto;
+ height: 200px;
+ width: 1132px;
+}
+
+/*共通:施設詳細、医師詳細*/
+.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: 8pt;
+ text-align: left;
+}
+
+table.tablesorter thead tr th, table.tablesorter tfoot tr th {
+ background-color: #e6EEEE;
+ border: 0.1px solid silver;
+ font-size: 8pt;
+ 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
index f3b8d077..36171aad 100644
--- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js
+++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js
@@ -135,26 +135,6 @@ $(function(){
$(".send").prop('disabled',true);
});
-// チェックボックス全選択関数
-// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること
-// 条件:ボタンにクラス名 send がついていること
-function allOn(){
- var selected = ".selected" + tableCurrentPage + " input.checkbox";
- $(selected).prop("checked", true);
- $(".send").prop('disabled',false);
-}
-
-// チェックボックス全解除関数
-// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること
-// 条件:ボタンにクラス名 send がついていること
-function allOff(pageCount){
- for (var i = 1; i <= pageCount; i++) {
- var selected = ".selected" + i + " input.checkbox";
- $(selected).prop("checked", false);
- }
- $(".send").prop('disabled',true);
-}
-
// 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数
// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること
// 条件:ボタンにクラス名 send がついていること
@@ -211,3 +191,63 @@ function DisplayErrorDialog(strMesssage) {
$("#errorTxt").html(strMesssage);
$("#error").dialog("open");
}
+
+/* ult.jsから移植 */
+// チェックボックス全選択関数
+// 条件:チェックボックスのクラス名に"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);
+ }
+}
+
+// Enter押下時にsubmitさせなくする
+$(function() {
+ $(document).on("keypress", "input:not(.allow_submit)", function(event) {
+ return event.which !== 13;
+ });
+});
+
+// 数字-以外を許さない入力チェック
+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;
+}
\ No newline at end of file
diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py
index 99bdd872..604acfe5 100644
--- a/ecs/jskult-webapp/src/system_var/constants.py
+++ b/ecs/jskult-webapp/src/system_var/constants.py
@@ -1,5 +1,10 @@
import os.path as path
+# 日付テーブル.バッチ処理ステータス:未処理
+BATCH_STATUS_PROCESSING = '1'
+# 日付テーブル.dump取得状態区分:未処理
+DUMP_STATUS_UNPROCESSED = '0'
+
BIO_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data')
BIO_EXCEL_TEMPLATE_FILE_PATH = path.join(BIO_TEMPORARY_FILE_DIR_PATH, 'BioData_template.xlsx')
@@ -112,18 +117,20 @@ LOGOUT_REASON_DO_LOGOUT = 'do_logout'
LOGOUT_REASON_LOGIN_ERROR = 'login_error'
LOGOUT_REASON_BATCH_PROCESSING = 'batch_processing'
LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE = 'batch_processing_ult'
+LOGOUT_REASON_BACKUP_PROCESSING = 'dump_processing'
LOGOUT_REASON_NOT_LOGIN = 'not_login'
LOGOUT_REASON_SESSION_EXPIRED = 'session_expired'
+LOGOUT_REASON_DB_ERROR = 'db_error'
LOGOUT_REASON_UNEXPECTED = 'unexpected'
LOGOUT_REASON_MESSAGE_MAP = {
LOGOUT_REASON_DO_LOGOUT: 'Logoutしました。',
LOGOUT_REASON_LOGIN_ERROR: '存在しないユーザー、
またはパスワードが違います。',
- # 機能を利用できないとかでいいんじゃ
LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、
生物由来データ参照は使用出来ません。',
LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、
マスタ-メンテは使用出来ません。',
- # 使ってなさそう
+ LOGOUT_REASON_BACKUP_PROCESSING: 'バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテは使用できません',
LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。',
LOGOUT_REASON_SESSION_EXPIRED: 'セッションが切れています。
再度Loginしてください。',
+ LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。',
LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。'
}
diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py
index 4eb32d90..c5bf66ef 100644
--- a/ecs/jskult-webapp/src/system_var/environment.py
+++ b/ecs/jskult-webapp/src/system_var/environment.py
@@ -19,6 +19,7 @@ DB_PASSWORD = os.environ['DB_PASSWORD']
DB_SCHEMA = os.environ['DB_SCHEMA']
BIO_SEARCH_RESULT_MAX_COUNT = int(os.environ['BIO_SEARCH_RESULT_MAX_COUNT'])
+ULTMARC_SEARCH_RESULT_MAX_COUNT = int(os.environ['ULTMARC_SEARCH_RESULT_MAX_COUNT'])
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/_header.html b/ecs/jskult-webapp/src/templates/_header.html
index ae41e99c..01a1521a 100644
--- a/ecs/jskult-webapp/src/templates/_header.html
+++ b/ecs/jskult-webapp/src/templates/_header.html
@@ -6,9 +6,12 @@
+
+
+
diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html
index 5ede3802..ae7a3d7c 100644
--- a/ecs/jskult-webapp/src/templates/bioSearchList.html
+++ b/ecs/jskult-webapp/src/templates/bioSearchList.html
@@ -5,10 +5,7 @@
{% include '_header.html' %}
{% endwith %}
-
-
-
-
+
diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html
new file mode 100644
index 00000000..8f9beb21
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/docInfo.html
@@ -0,0 +1,231 @@
+
+
+
+ {% with subtitle = ultmarc.subtitle %}
+ {% include '_header.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..365e2745
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/docSearch.html
@@ -0,0 +1,266 @@
+
+
+
+ {% with subtitle = ultmarc.subtitle %}
+ {% include '_header.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..7e84fd4c
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html
@@ -0,0 +1,12 @@
+
+
+
+ {% with subtitle = view.subtitle %}
+ {% include '_header.html' %}
+ {% endwith %}
+
+
+
+ 施設担当者データCSVダウンロード
+
+
diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html
new file mode 100644
index 00000000..9ec84207
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html
@@ -0,0 +1,13 @@
+
+
+
+ {% with subtitle = view.subtitle %}
+ {% include '_header.html' %}
+ {% endwith %}
+
+
+
+
+ 施設担当者データCSVアップロード
+
+
diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html
new file mode 100644
index 00000000..d93b619c
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/instInfo.html
@@ -0,0 +1,287 @@
+
+
+
+ {% with subtitle = ultmarc.subtitle %}
+ {% include '_header.html' %}
+ {% endwith %}
+
+
+
+
+
+
+
+
+ {{ultmarc.subtitle}}
+
+ {% if ultmarc.is_batch_processing %}
+ 日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..361977ae
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/instSearch.html
@@ -0,0 +1,264 @@
+
+
+
+ {% with subtitle = ultmarc.subtitle %}
+ {% include '_header.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..957279fa
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html
@@ -0,0 +1,25 @@
+
+
+
+ {% with subtitle = menu.subtitle %}
+ {% include '_header.html' %}
+ {% endwith %}
+
+
+
+
MeDaCA
マスターメンテメニュー
+
+
+
施設担当者データCSVアップロード
+
+
+
施設担当者データCSVダウンロード
+
+
+
テーブル上書きコピー
+
+
+
メニューへ
+
+
+
diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html
index 6da67294..59eb8a74 100644
--- a/ecs/jskult-webapp/src/templates/menu.html
+++ b/ecs/jskult-webapp/src/templates/menu.html
@@ -11,10 +11,10 @@
MeDaCA
機能メニュー
{% if menu.is_available_ult_doctor_menu() %}
- Ultmarc照会(医師)
+ Ultmarc照会(医師)
{% endif %}
{% if menu.is_available_ult_inst_menu() %}
- Ultmarc照会(施設)
+ Ultmarc照会(施設)
{% endif %}
{% if menu.is_available_bio_menu() %}
{% if not menu.is_batch_processing() %}
@@ -24,10 +24,12 @@
{% endif %}
{% endif %}
{% if menu.is_available_master_maintenance_menu() %}
- {% if not menu.is_batch_processing() %}
- マスターメンテメニュー
+ {% if menu.is_batch_processing() %}
+ マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ {% elif menu.is_backup_processing() %}
+ バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテメニューは利用できません
{% else %}
- マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ マスターメンテメニュー
{% endif %}
{% endif %}
Logout
diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html
new file mode 100644
index 00000000..e473b469
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/tableOverride.html
@@ -0,0 +1,12 @@
+
+
+
+ {% with subtitle = view.subtitle %}
+ {% include '_header.html' %}
+ {% endwith %}
+
+
+
+ テーブル上書きコピー
+
+
diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock
index 91874a55..20ed5593 100644
--- a/lambda/check-view-security-option/Pipfile.lock
+++ b/lambda/check-view-security-option/Pipfile.lock
@@ -43,19 +43,19 @@
},
"boto3": {
"hashes": [
- "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5",
- "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046"
+ "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8",
+ "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434"
],
"index": "pypi",
- "version": "==1.26.97"
+ "version": "==1.26.156"
},
"botocore": {
"hashes": [
- "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a",
- "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82"
+ "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda",
+ "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4"
],
"markers": "python_version >= '3.7'",
- "version": "==1.29.97"
+ "version": "==1.29.156"
},
"cffi": {
"hashes": [
@@ -128,32 +128,28 @@
},
"cryptography": {
"hashes": [
- "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1",
- "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7",
- "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06",
- "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84",
- "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915",
- "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074",
- "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5",
- "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3",
- "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9",
- "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3",
- "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011",
- "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536",
- "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a",
- "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f",
- "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480",
- "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac",
- "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0",
- "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108",
- "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828",
- "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354",
- "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612",
- "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3",
- "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"
+ "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db",
+ "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a",
+ "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039",
+ "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c",
+ "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3",
+ "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485",
+ "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c",
+ "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca",
+ "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5",
+ "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5",
+ "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3",
+ "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb",
+ "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43",
+ "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31",
+ "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc",
+ "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b",
+ "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006",
+ "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a",
+ "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"
],
"index": "pypi",
- "version": "==39.0.2"
+ "version": "==41.0.1"
},
"jmespath": {
"hashes": [
@@ -172,11 +168,11 @@
},
"pymysql": {
"hashes": [
- "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641",
- "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"
+ "sha256:3dda943ef3694068a75d69d071755dbecacee1adf9a1fc5b206830d2b67d25e8",
+ "sha256:89fc6ae41c0aeb6e1f7710cdd623702ea2c54d040565767a78b00a5ebb12f4e5"
],
"index": "pypi",
- "version": "==1.0.2"
+ "version": "==1.0.3"
},
"python-dateutil": {
"hashes": [
@@ -188,11 +184,11 @@
},
"s3transfer": {
"hashes": [
- "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd",
- "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"
+ "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346",
+ "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"
],
"markers": "python_version >= '3.7'",
- "version": "==0.6.0"
+ "version": "==0.6.1"
},
"simplejson": {
"hashes": [
@@ -255,11 +251,11 @@
},
"urllib3": {
"hashes": [
- "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305",
- "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"
+ "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f",
+ "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"
],
"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.15"
+ "version": "==1.26.16"
}
},
"develop": {
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
index 74472fcc..b825ac53 100644
--- a/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql
+++ b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql
@@ -2,69 +2,75 @@
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 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);
- SIGNAL SQLSTATE '45000'
- SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg;
- END;
+ -- 例外処理
+ 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;
+ SET @error_state = NULL, @error_msg = NULL;
- 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.inst_merge_t;
+ 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,
+ 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成① 終了'
+ );
- 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 dim
- LEFT OUTER JOIN src05.com_inst 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();
+ 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,
- 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 終了'
- );
+ 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..39e8f065
--- /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,
+ '卸販売実績テーブル(洗替後)過去5年以前のデータ削除① 開始');
+
+ 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,
+ '卸販売実績テーブル(洗替後)過去5年以前のデータ削除① 終了');
+
+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..56758f18
--- /dev/null
+++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql
@@ -0,0 +1,480 @@
+-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する
+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 @extract_to_datetime = ADDTIME(CAST(extract_to_date AS DATETIME), '23:59:59');
+
+ 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 extract_to_datetime
+ ) AS sub
+ INNER JOIN src05.sales AS s
+ ON s.dwh_upd_dt BETWEEN sub.extract_from_datetime AND sub.extract_to_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, @extract_to_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 extract_to_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 BETWEEN sub.extract_from_datetime AND sub.extract_to_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, @extract_to_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/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
index 6a6f9dd7..1c75c4ea 100644
--- a/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql
+++ b/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql
@@ -2,75 +2,81 @@
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 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);
- SIGNAL SQLSTATE '45000'
- SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg;
- END;
+ -- 例外処理
+ 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;
+ SET @error_state = NULL, @error_msg = NULL;
- 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施設統合マスタ(洗替処理一時テーブル)作成① 開始');
- TRUNCATE TABLE internal05.v_inst_merge_t;
+ 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施設統合マスタ(洗替処理一時テーブル)作成① 終了');
- 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 vhmv,
- src05.fcl_mst_v fmv
- INNER JOIN (
- SELECT
- v_inst_cd,
- MAX(sub_num) AS sno
- FROM
- src05.fcl_mst_v
- GROUP BY
- v_inst_cd
- ) 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';
+ 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施設統合マスタ(洗替処理一時テーブル)作成② 終了' );
+ 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..aad11100
--- /dev/null
+++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql
@@ -0,0 +1,128 @@
+-- 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.卸組織洗替② 開始'
+ );
+
+ 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/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/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_diff.json b/s3/config/crm/object_info/crm_object_list_diff.json
index db145744..2840932f 100644
--- a/s3/config/crm/object_info/crm_object_list_diff.json
+++ b/s3/config/crm/object_info/crm_object_list_diff.json
@@ -2870,6 +2870,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",
@@ -3002,6 +3003,239 @@
],
"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_Reason_unformatted__c",
+ "MSJ_Data_Id__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",
+ "Followup_Activity_Type_vod__c",
+ "MSJ_Data_ID__c",
+ "MSJ_Reason_ID__c",
+ "MSJ_Task_External_Id__c",
+ "MSJ_Task_Source__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",
+ "Followup_Activity_Type_vod__c",
+ "MSJ_Data_ID__c",
+ "MSJ_Reason_ID__c",
+ "MSJ_Task_External_Id__c",
+ "MSJ_Task_Source__c",
+ "MSJ_Visit_Type__c"
+ ],
+ "is_skip": false,
+ "is_update_last_fetch_datetime": true
}
]
}
\ No newline at end of file
diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env
index 9cd4ecf8..9f6b542a 100644
--- a/s3/config/jskult/task_settings/web_task_settings.env
+++ b/s3/config/jskult/task_settings/web_task_settings.env
@@ -4,3 +4,4 @@ AUTHORIZE_ENDPOINT=oauth2/authorize
TOKEN_ENDPOINT=oauth2/token
BIO_SEARCH_RESULT_MAX_COUNT=35000
SESSION_EXPIRE_MINUTE=20
+ULTMARC_SEARCH_RESULT_MAX_COUNT=500
diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt
new file mode 100644
index 00000000..ed6c978e
--- /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,Followup_Activity_Type_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__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,Followup_Activity_Type_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,MSJ_Visit_Type__c
+src02.crm_Event
+org02.crm_Event
+
+
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..61aa8889
--- /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
+src02.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..85c9e0df
--- /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
+src02.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..96ab5c78
--- /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_Reason_unformatted__c,MSJ_Data_Id__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_Reason_unformatted__c,MSJ_Data_Id__c,MSJ_reason_id__c
+src02.crm_Suggestion_vod__c
+org02.crm_Suggestion_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..a13619b4 100644
--- a/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt
+++ b/s3/data/crm/settings/CRM_Survey_Target_vod__c.txt
@@ -4,9 +4,9 @@ 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
+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
src02.crm_Survey_Target_vod__c
org02.crm_Survey_Target_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..45e1735b
--- /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,Followup_Activity_Type_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__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,Followup_Activity_Type_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,MSJ_Visit_Type__c
+src02.crm_Task
+org02.crm_Task
+
+
diff --git a/s3/data/crm/settings/configmap.config b/s3/data/crm/settings/configmap.config
index 9b24ca55..83fdcb0f 100644
--- a/s3/data/crm/settings/configmap.config
+++ b/s3/data/crm/settings/configmap.config
@@ -53,6 +53,11 @@ 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データ 全件連携】 */
CRM_Territory2_ALL_[0-9]{14}\.(CSV|csv) CRM_Territory2_ALL.txt
CRM_UserTerritory2Association_ALL_[0-9]{14}\.(CSV|csv) CRM_UserTerritory2Association_ALL.txt